ruby-on-rails 在没有模型的Rails中进行验证

41ik7eoe  于 2022-11-19  发布在  Ruby
关注(0)|答案(2)|浏览(174)

我有一个表单,允许用户将消息发送到电子邮件,我想给它添加验证。我没有一个模型,只有一个控制器。我应该如何在Rails中做这件事?
我正在考虑在控制器中进行验证,并使用flash对象向用户显示错误。有没有更好的方法来做这件事?

iszxjhcz

iszxjhcz1#

最好的方法是将伪模型 Package 在一个类中,并在其中添加验证。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:)

i1icjdpr

i1icjdpr2#

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

相关问题