Padrinoいいですよね。
View用のHelperも結構揃っててRails並にテンプレートが書きやすいのですが、
メソッド名が同じでも実装は違ってるのでRailsと同じ動作を期待するとアレッ・・・?
ってなることあります。
今回はform_forというformを定義するためのHelperに、
RailsとPadrinoの違いを若干解消するための話を書きます。
RailsのFormBuilderではform_forに渡したオブジェクトが、newしたばかりの、
ただのインスタンスだったら、formのmethodがPOSTになり、
DBに保存済みな値だったらPUTになるという振る舞いがデフォルトであるのですが、
Padrinoのform_forでは実装されていません。
これが使えると何が嬉しいかというと、Railsのscaffoldで生成されるテンプレートのように、
フォームの部分を_form.html.erbのように部分テンプレートとして切り出すことで、
新規投稿と、編集画面で同じフォームを簡単に扱うことができます。
Railsの実装を見てみると、ActiveRecordのpresisted?メソッドで、
データが保存されているかどうかをチェックしているようなので、
仮にPadrinoでも、ActiveRecordを使っているとしたら、以下のように
Helperを定義すると、Railsと似た様な挙動をさせることができます。
Foo.helpers do
def form_for_polymorphic(obj, base_url, options = {}, &block)
request_method = obj.respond_to?(:persisted?) && obj.persisted? ? :put : :post
url = request_method == :put ? "#{base_url}/#{obj.id}" : base_url
form_for obj, url, :method => request_method, &block
end
end
こんな感じで、form_forをラップするメソッドを書いてけば良いかと思います。
参考ページ: