特定のモデルに 1 対 1 で一致しないフォームが多数あります。特に、関連するモデルの検証に一致しない特定の検証が必要な場合は、これらのフォームを強化するために Form Object パターン (または Decorator、またはそれを呼びたいもの) を使用してきました。
例:
class ProfileClaimRequestForm
extend ActiveModel::Naming
include ActiveModel::Conversion
include ActiveModel::Validations
attr_accessor :email, :profile
delegate :persisted?, :id, to: :profile #??
validate :matching_emails
def initialize profile, email = nil
self.profile = profile
self.email = email
end
private
def matching_emails
errors.add(:email, 'The email address entered does not match our records') unless self.email == self.profile.profile.email
end
end
これを呼び出すために、私はform_for @form_obj, profile_claim_path(@form_obj.profile.id)
正常に動作するものを使用してきましたが、そのパス宣言を DRY できることを望んでいます。パスなどを定義するためにフォームオブジェクトに応答させることができる魔法の方法があるかどうか疑問に思っています。理想的には、私はそれを下げることができましたform_for @form_obj
ちなみに、私は現在 Rails 3 を使用していますが、近いうちに Rails 4 に移行する予定です。