在没有模型的情况下在Rails中validation

我有一个允许用户向电子邮件发送消息的表单,我想为其添加validation。 我没有这个模型,只有一个控制器。 我应该如何在Rails中执行此操作?

我正在考虑在控制器中进行validation,并使用flash对象向用户显示错误。 有更好的方法吗?

最好的方法是在类中包装伪模型,并在那里添加validation。 Rails方式声明你不应该在控制器上放置模型行为,唯一的validation应该是与请求本身一起的(validation,授权等)。

在Rails 2.3+中,您可以包含ActiveRecord::Validations ,您必须定义ActiveRecord层期望的某些方法。 有关更深入的解释,请参阅此文章 。 以下代码改编自该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中,您可以使用这些性感validation 🙂

对于Rails 3+,您应该使用ActiveModel::Validations将Rails样式的validation添加到常规Ruby对象。

来自文档 :

主动模型validation

为您的对象提供完整的validation框架。

最小的实现可能是:

 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中获知的完整标准validation堆栈:

 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对象初始化的实例添加errors方法,因此您无需手动执行此操作。