【问题标题】:Rails 4 - showing errors in a model that is not ActiverecordRails 4 - 在不是 Activerecord 的模型中显示错误
【发布时间】:2015-10-18 22:30:47
【问题描述】:

我有一个无表模型(即不保存在数据库中),以便管理表单。在遵循Railscast 剧集中的指令集后,它大部分都在工作:

class PaymentRequest
    include ActiveModel::Validations
    include ActiveModel::Conversion
    extend ActiveModel::Naming

    attr_accessor :request_id, :amount, :description, :reference, :charge_date
    validates :request_id, presence: true
    validates :amount, presence: true, numericality: true
    validates :charge_date, presence: true

    def initialize(attributes = {})
        attributes.each do |name, value|
            send("#{name}=", value)
        end
    end

    def persisted?
        false
    end
end

当我执行PaymentRequest.new().valid? 时,我得到false(反之亦然,如果它确实有效)。

但是我没有收到任何错误消息:运行 PaymentRequest.new().errors.messages 时,我得到一个空哈希 {}

我错过了什么?

谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 model


    【解决方案1】:

    errors 仅在您调用验证方法后才会填充,例如 valid?。如果这样做,您将收到与 ActiveRecord 对象一样的错误消息。

    这是一个示例,使用您在问题中提供的 PaymentRequest 代码:

    p = PaymentRequest.new
    p.errors.messages # => {}
    p.valid? # => false
    p.errors.messages # => {:request_id=>["can't be blank"],... 
    

    注意errors 最初是空白的,但在调用valid? 时会立即填充。

    【讨论】:

    • 知道了 - 我在控制台中按顺序运行 2 进行测试。将其保存到变量中会有所不同!
    【解决方案2】:

    您的errors.messages 哈希为空,因为您使用的是new 方法:PaymentRequest.new(),因此您没有尝试在数据库中保留任何内容。

    在对象被持久化到数据库之前调用验证,例如当您尝试save 对象或调用验证方法时。

    在您的示例中,如果您尝试保存付款对象,那么您的 errors.messages 哈希将填充适当的消息:

    p = PaymentRequest.new()
    p.errors.messages
    # => {} # empty hash because you did not try to save the p object yet
    p.save # at this point validations are happening
    p.errors.messages 
    # => {:charge_date =>["can't be blank"]} . . . 
    

    或者,您可以使用:create 方法:

    p = PaymentRequest.create()
    p.errors.messages 
    # => {:charge_date =>["can't be blank"]} . . . 
    

    然后,您将在 errors.messages 哈希中看到错误消息,因为 create 方法试图保存对象。

    要回答您的其他问题,PaymentRequest.new().valid?false,因为保存/持久之前的所有内容都是 false。当对象为saved 成功时,valid? 将返回true

    【讨论】:

    • 我可能已经更清楚地表明我没有将它保存到数据库中(因此持久化为假)。有效的?无论持久性如何(因为开头包含/扩展)都可以工作。
    猜你喜欢
    • 1970-01-01
    • 2011-08-17
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    相关资源
    最近更新 更多