如何在表单对象上定义路由

时间:2013-07-18 11:04:35

标签: ruby-on-rails form-for form-helpers

我有许多表格与特定型号一对一不匹配。我一直在使用表单对象模式(或装饰器,或任何你想称之为它)为这些表单提供支持,特别是当需要发生与相关模型验证不匹配的特定验证时。

示例:

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.

1 个答案:

答案 0 :(得分:0)

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

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

现在在你的情况下,你没有遵循这个约定,所以干涸的唯一方法就是使用嵌套资源。

如果在您的route.rb中您将资源定义为:

resources :users do
  resources :profiles
end

然后Rails将生成诸如/users/:id/profiles之类的路径。你可以直接使用这个form_for [@user, @profile]

这样的表单助手

长答案简短:如果您不遵循Rails约定,则必须使用form_for的长语法并手动指定表单的目标路径