6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Padrinoのform_forをRailsの様にオブジェクトの状態ごとにmethodを変えたい時のアレ

Last updated at Posted at 2013-01-01

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と似た様な挙動をさせることができます。

app/helpers/foo_helpers.rb
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をラップするメソッドを書いてけば良いかと思います。

参考ページ:

  1. rails/actionpack/lib/action_view/helpers/form_helper.rb at beba8267c96a3dbc1f505ecc099dbf14db8dde4c · rails/rails · GitHub
  2. padrino-framework/padrino-helpers/lib/padrino-helpers/form_helpers.rb at master · padrino/padrino-framework · GitHub
6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?