【发布时间】:2010-08-25 05:32:14
【问题描述】:
我有一个允许用户向电子邮件发送消息的表单,我想向它添加验证。我没有这个模型,只有一个控制器。我应该如何在 Rails 中做到这一点?
我正在考虑在控制器中进行验证,并使用flash 对象向用户显示错误。有更好的方法吗?
【问题讨论】:
标签: ruby-on-rails
我有一个允许用户向电子邮件发送消息的表单,我想向它添加验证。我没有这个模型,只有一个控制器。我应该如何在 Rails 中做到这一点?
我正在考虑在控制器中进行验证,并使用flash 对象向用户显示错误。有更好的方法吗?
【问题讨论】:
标签: ruby-on-rails
最好的方法是将你的伪模型封装在一个类中,并在那里添加验证。 Rails 方式声明您不应该将模型行为放在控制器上,唯一的验证应该是请求本身的验证(身份验证、授权等)
在 Rails 2.3+ 中,您可以包含 ActiveRecord::Validations,但您必须定义一些 ActiveRecord 层期望的方法。请参阅this post 以获得更深入的解释。以下代码改编自该帖子:
require 'active_record/validations'
class Email
attr_accessor :name, :email
attr_accessor :errors
def initialize(*args)
# Create an Errors object, which is required by validations and to use some view methods.
@errors = ActiveRecord::Errors.new(self)
end
# Required method stubs
def save
end
def save!
end
def new_record?
false
end
def update_attribute
end
# Mix in that validation goodness!
include ActiveRecord::Validations
# Validations! =)
validates_presence_of :name
validates_format_of :email, :with => SOME_EMAIL_REGEXP
end
在 Rails3 中,您可以使用 sexy validations :)
【讨论】:
ActiveModel::Validations。有关详细信息和示例,请参见此处:api.rubyonrails.org/classes/ActiveModel/Validations.html。
对于 Rails 3+,您应该使用 ActiveModel::Validations 将 Rails 样式的验证添加到常规 Ruby 对象。
来自the docs:
活动模型验证
为您的对象提供完整的验证框架。
一个最小的实现可能是:
class Person include ActiveModel::Validations attr_accessor :first_name, :last_name validates_each :first_name, :last_name do |record, attr, value| record.errors.add attr, 'starts with z.' if value.to_s[0] == ?z end end它为您提供了完整的标准验证堆栈 从 Active Record 知道:
person = Person.new person.valid? # => true person.invalid? # => false person.first_name = 'zoolander' person.valid? # => false person.invalid? # => true person.errors.messages # => {first_name:["starts with z."]}注意
ActiveModel::Validations会自动添加errors方法 使用新的ActiveModel::Errors对象初始化您的实例, 因此您无需手动执行此操作。
【讨论】: