【问题标题】:Validation in Rails without a model在没有模型的 Rails 中进行验证
【发布时间】:2010-08-25 05:32:14
【问题描述】:

我有一个允许用户向电子邮件发送消息的表单,我想向它添加验证。我没有这个模型,只有一个控制器。我应该如何在 Rails 中做到这一点?

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

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

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

    【讨论】:

    • 简单易行。谢谢,在哪里找这样的东西。
    • 对于 Rails 3,将 ActiveRecord::Errors 替换为 ActiveModel::Errors
    • 对于 Rails 3 或 4,应该使用ActiveModel::Validations。有关详细信息和示例,请参见此处:api.rubyonrails.org/classes/ActiveModel/Validations.html
    【解决方案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会自动添加errors方法 使用新的 ActiveModel::Errors 对象初始化您的实例, 因此您无需手动执行此操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 2016-04-29
      • 1970-01-01
      • 2016-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多