【发布时间】:2011-01-18 14:09:34
【问题描述】:
通常,在 Rails 中使用表单助手时,每个字段都直接与相应对象上的方法相关。
但是,我有一个表单(用户注册)需要包含不属于用户模型本身但需要显示的字段(例如,卡详细信息)。
如何构建表单以便获得必要的字段,并根据需要验证它们(使其适合我的所有其他验证)而不弄脏我的用户模型?
【问题讨论】:
标签: ruby-on-rails ruby helpers actionview
通常,在 Rails 中使用表单助手时,每个字段都直接与相应对象上的方法相关。
但是,我有一个表单(用户注册)需要包含不属于用户模型本身但需要显示的字段(例如,卡详细信息)。
如何构建表单以便获得必要的字段,并根据需要验证它们(使其适合我的所有其他验证)而不弄脏我的用户模型?
【问题讨论】:
标签: ruby-on-rails ruby helpers actionview
我不确定你所说的“弄脏”你的用户模型是什么意思,但你可以使用attr_accessor method 来做到这一点。这将允许您为模型创建一个可用于验证的属性:
class Widget < ActiveRecord::Base
attr_accessor :confirmation_email
validates_length_of :confirmation_email, :within => 1..10
end
要仅在特定时间运行验证,您可以使用:if 条件:
validates_length_of :confirmation_email, :within => 1..10, :if => Proc.new { |widget| widget.creation_step > 2 }
您还可以使用类方法,例如::if => :payment_complete。有了这些,您应该能够实现您想要的功能。据我所知,没有更简洁的方法了。
【讨论】:
Yehuda Katz 有一个 great explaination 说明如何使用 ActiveModel 使任意类与 Rails 的表单助手兼容。不过,这只有在您使用 Rails 3 时才有效。
如果你不是生活在最前沿,请观看Railscasts episode 193, "Tableless Model",它描述了如何创建一个像ActiveRecord::Base 这样的类,它可以与form_for 一起使用。
【讨论】: