Rails认为使用attr_accessor的模型是有效的,但事实并非如此

时间:2015-11-13 18:29:06

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

我有一个attr_accessor的模型,我在这个attr_accessor中添加了一个错误。为什么有效?我认为下面的代码是可自我解释的:

class Dealer < AR::Base
  attr_accessor :keyword_data

  def keyword_data=(file)
    begin
      parse_values(file)
    rescue CSVKeywordsParser::ReadError => e
      errors.add(:keyword_data, e.message)
    end
  end
end

>> dealer.errors
=> #<ActiveModel::Errors:0x007ff586359610 @base=#<Dealer id: 6, name: "Something">, @messages={}>
>> dealer.errors.any?
=> false
>> dealer.add :keyword_data, "xxx"
=> ["xxx"]
>> dealer.errors
=> #<ActiveModel::Errors:0x007ff586359610 @base=#<Dealer id: 6, name: "Something">, @messages={:keyword_data=>["xxx"]}>
>> dealer.errors.any?
=> true
>> dealer.valid?
=> true

如何向attr_accessor添加将通过activemodel跟踪的错误,因此,dealer.valid?将返回false(因为它需要)?

1 个答案:

答案 0 :(得分:1)

查看valid?的课程。它首先清除所有错误,然后运行验证。如果您手动添加错误,则无法看到它。奇怪,但消息来源说。修复是为keyword_data添加验证,以便自动获取。

def valid?(context = nil)
  current_context, self.validation_context = validation_context, context
  errors.clear
  run_validations!
ensure
  self.validation_context = current_context
end

https://github.com/rails/rails/blob/107f4282bbfabc011d5ad3bcf3fb3c6fb812ad30/activemodel/lib/active_model/validations.rb#L334