1

我有许多表格与特定型号一对一不匹配。我一直在使用表单对象模式(或装饰器,或任何您想调用的名称)来支持这些表单,特别是当需要进行与相关模型验证不匹配的特定验证时。

例子:

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)它工作正常,但是我希望我可以干掉那个路径声明。我想知道是否有一些魔术方法可以让我的表单对象响应以定义路径或类似的东西。理想情况下,我可以把它归结为form_for @form_obj

需要注意的是,我目前使用的是 Rails 3,但我们计划在可预见的将来迁移到 Rails 4。

4

1 回答 1

0

调用时form_for @form_obj,rails 将调用to_param资源,并将使用您resources在 routes.rb 中的定义来生成路径。如果您遵循 Rails 约定,这将很有帮助。

例如:form_for @user将生成action="/users/1"(假设用户的 id 为 1)

现在,在您的情况下,您没有遵循此约定,因此 DRY-up 的唯一方法是使用嵌套资源。

如果,在您的 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 回答