在没有模型的情况下在Rails中验证

时间:2010-08-25 05:32:14

标签: ruby-on-rails

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

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

2 个答案:

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