【发布时间】:2013-10-16 15:39:51
【问题描述】:
Rails 4 应用程序。
使用form_tag 构建表单并想知道当表单不支持我的模型时处理和显示错误的典型方式(如果有的话)?
我发现的所有示例都与模型和典型的 @model.errors.any? 条件视图有关,但这不适用于 form_tag。
【问题讨论】:
标签: ruby-on-rails forms ruby-on-rails-4
Rails 4 应用程序。
使用form_tag 构建表单并想知道当表单不支持我的模型时处理和显示错误的典型方式(如果有的话)?
我发现的所有示例都与模型和典型的 @model.errors.any? 条件视图有关,但这不适用于 form_tag。
【问题讨论】:
标签: ruby-on-rails forms ruby-on-rails-4
你应该做的是:
首先包含 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
【讨论】:
我建议将 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
希望它可以帮助您解决问题。
【讨论】: