1

特定のモデルに 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 に移行する予定です。

4

1 に答える 1

0

を呼び出すとform_for @form_obj、レールはto_paramリソースを呼び出しresources、routes.rb の定義を使用してパスを生成します。これは、Rails の規則に従っている場合に役立ちます。

例:form_for @user生成されますaction="/users/1"(ユーザーの ID が 1 の場合)

あなたのケースでは、この規則に従っていないため、DRY アップする唯一の方法は、ネストされたリソースを使用することでした。

route.rb でリソースを次のように定義するとします。

resources :users do
  resources :profiles
end

次に、Rails は次のようなパスを生成/users/:id/profilesします。そして、このようなフォームヘルパーでこれを直接使用できますform_for [@user, @profile]

長い答えの短い: Rails の規則に従わない場合は、長い構文を使用してform_for、フォームのターゲット パスを手動で指定する必要があります。

于 2013-07-18T11:41:41.130 に答える