通常,在 Rails 中使用表单助手时,每个字段都直接与相应对象上的方法相关联。
但是,我有一个表单(用户注册)需要包含不属于用户模型本身但需要出现的字段(例如,卡详细信息)。
如何构建表单以便获得必要的字段,并根据需要验证它们(以便它适合我的所有其他验证)而不弄脏我的用户模型?
通常,在 Rails 中使用表单助手时,每个字段都直接与相应对象上的方法相关联。
但是,我有一个表单(用户注册)需要包含不属于用户模型本身但需要出现的字段(例如,卡详细信息)。
如何构建表单以便获得必要的字段,并根据需要验证它们(以便它适合我的所有其他验证)而不弄脏我的用户模型?
我不确定你所说的“弄脏”你的用户模型是什么意思,但你可以使用attr_accessor 方法来做到这一点。这将允许您为模型创建一个可用于验证的属性:
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对如何使用Rails 的表单助手创建任意类进行了很好的解释。ActiveModel
不过,这仅在您使用 Rails 3 时才有效。
如果您不是生活在最前沿,请观看Railscasts 的第 193 集“无表模型”,它描述了如何创建一个足以与ActiveRecord::Base
它一起工作的类form_for
。