Rails Advent Calendarの2日目の記事である Rails4でFormオブジェクトを作る際に気をつける3つのポイント|江の島エンジニアBlog を読んだんですが、ちょっと気になる所があったんで突っ込みを入れてみる。
モデル層であるFormオブジェクトにURLを返すためのメソッド定義するのは、あんまりよろしく無いんじゃないかと思う。
そもそもurl_helperをちゃんと動かすためにはホスト名やポート等のリクエスト情報が必要で、この例の様に相対パスを出力するだけなら使えなくもないけどモデル層から呼ばれることは、余り想定されていない。
デコレーター層に生やすか、そもそも組込みのヘルパーを使うべきではないかと思う。
ちなみにform_for
ヘルパーが中で使っているのはpolymorphic_path
というヘルパーで、地味だし自分も良く忘れるのだが、この例ではこれがそのまま使えるはず。
- form_for @site_form, url: polymorphic_path(@site_form.site) do
これで、Formオブジェクトのurl
メソッドは必要無くなるし、persisted?
かどうかの分岐も不要になる。こういう感じでいかがだろうか?
もうちょっと出力フォーマットが複雑だったら、やっぱりデコレーターかなあ。
ついでにもう一つ。Rails4なら、
extend ActiveModel::Naming
include ActiveModel::Conversion
include ActiveModel::Validations
って書かなくても、
include ActiveModel::Model
で良い。
ActiveModel::Model
は以下と等価。
extend ActiveModel::Naming
extend ActiveModel::Translation
include ActiveModel::Validations
include ActiveModel::Conversion