【问题标题】:Using Rails form helpers on non-existent methods在不存在的方法上使用 Rails 表单助手
【发布时间】:2011-01-18 14:09:34
【问题描述】:

通常,在 Rails 中使用表单助手时,每个字段都直接与相应对象上的方法相关。

但是,我有一个表单(用户注册)需要包含不属于用户模型本身但需要显示的字段(例如,卡详细信息)。

如何构建表单以便获得必要的字段,并根据需要验证它们(使其适合我的所有其他验证)而不弄脏我的用户模型?

【问题讨论】:

    标签: ruby-on-rails ruby helpers actionview


    【解决方案1】:

    我不确定你所说的“弄脏”你的用户模型是什么意思,但你可以使用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 =&gt; 1..10, :if =&gt; Proc.new { |widget| widget.creation_step &gt; 2 }

    您还可以使用类方法,例如::if =&gt; :payment_complete。有了这些,您应该能够实现您想要的功能。据我所知,没有更简洁的方法了。

    【讨论】:

    • 基本上我没有构建一个与相关模型直接相关的表单。例如,注册表单可能包含一些用户属性和一些“丢弃”属性(例如您可能在 CC 网关上触发然后忘记的那些)。如果我在我的用户模型上创建属性,我总是需要提供这些属性以通过验证,而我只想在这个单一位置的单一表单上验证这些项目。
    • 我添加了有关 :if 条件的信息,这可能就是您要查找的内容。
    【解决方案2】:

    Yehuda Katz 有一个 great explaination 说明如何使用 ActiveModel 使任意类与 Rails 的表单助手兼容。不过,这只有在您使用 Rails 3 时才有效。

    如果你不是生活在最前沿,请观看Railscasts episode 193, "Tableless Model",它描述了如何创建一个像ActiveRecord::Base 这样的类,它可以与form_for 一起使用。

    【讨论】:

      猜你喜欢
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多