【问题标题】:Rails errors array for form_tag formsform_tag 表单的 Rails 错误数组
【发布时间】:2013-10-16 15:39:51
【问题描述】:

Rails 4 应用程序。

使用form_tag 构建表单并想知道当表单不支持我的模型时处理和显示错误的典型方式(如果有的话)?

我发现的所有示例都与模型和典型的 @model.errors.any? 条件视图有关,但这不适用于 form_tag

【问题讨论】:

    标签: ruby-on-rails forms ruby-on-rails-4


    【解决方案1】:

    你应该做的是:

    首先包含 ActiveModel::Model

    然后为您的属性制作访问器

    最后为这些属性添加验证

    例如,如果您有一个不想将其与数据库绑定的联系人模型

    class Contact
    
      include ActiveModel::Model
    
      attr_accessor :name, :email, :message
    
      validates :name, presence: true
      validates :email, presence: true
      validates :message, presence: true, length: { maximum: 300 }
    end
    

    然后在您的视图中,您可以像使用习惯性的 activeRecord 模型一样遍历错误

    if @model.errors.any?
       # Loop and show errors.... 
    end
    

    【讨论】:

      【解决方案2】:

      我建议将 ActiveModel::Validations 包含在不具有模型行为但我们需要验证的类中。例如,考虑 Ticket 类

      导轨 4

      class Ticket
        include ActiveModel::Model
      
        attr_accessor :title, :description
      
        validate_presence_of :title
        validate_presence_of :description
      end
      

      此外,如果您查看 Rails 4 的 activemodel/lib/active_model/model.rb 代码以更好地理解为什么在 Rails 4 中“包含 ActiveModel::Model”仅足以使类表现得像模型,请查看更多详细信息。

      def self.included(base)
        base.class_eval do
          extend ActiveModel::Naming
          extend ActiveModel::Translation
          include ActiveModel::Validations
          include ActiveModel::Conversion
        end
      end
      

      轨道 3

      class Ticket
        include ActiveModel::Conversion
        include ActiveModel::Validations
        extend ActiveModel::Naming
      
        attr_accessor :title, :description
      
        validate_presence_of :title
        validate_presence_of :description
      end
      

      您的 Ticket 类的行为类似于模型,使您可以使用这些方法进行错误验证

       Ticket.new(ticket_params)
       @ticket.valid?
       @ticket.errors
       @ticket.to_param
      

      希望它可以帮助您解决问题。

      【讨论】:

        猜你喜欢
        • 2014-02-13
        • 2014-01-09
        • 2011-06-18
        • 1970-01-01
        • 2012-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多