我有许多表格与特定型号一对一不匹配。我一直在使用表单对象模式(或装饰器,或任何你想称之为它)为这些表单提供支持,特别是当需要发生与相关模型验证不匹配的特定验证时。
示例:
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.
答案 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
的长语法并手动指定表单的目标路径