我有一个允许用户向电子邮件发送消息的表单,我想为其添加验证。我没有这个模型,只有一个控制器。我应该如何在Rails中执行此操作?
我正在考虑在控制器中进行验证,并使用flash对象向用户显示错误。有没有更好的方法呢?
答案 0 :(得分:6)
最好的方法是在类中包装伪模型,并在那里添加验证。 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 :()
答案 1 :(得分:2)
对于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
会自动添加错误方法 使用新的ActiveModel::Errors
对象初始化的实例 因此,您无需手动执行此操作。