ruby-on-rails - Rails validates_associated 与模型的错误信息

标签 ruby-on-rails ruby validation ruby-on-rails-4 associations

我在模型中使用 validates_associated 来使用其他模型的验证代码。问题是验证失败的消息是“..无效”。

我想将模型验证失败的实际描述性错误冒泡到顶部!

我发现了这个问题: validates associated with model's error message

它有一个看起来非常接近的解决方案:

module ActiveRecord
  module Validations
    class AssociatedBubblingValidator < ActiveModel::EachValidator
      def validate_each(record, attribute, value)
        (value.is_a?(Array) ? value : [value]).each do |v|
          unless v.valid?
            v.errors.full_messages.each do |msg|
              record.errors.add(attribute, msg, options.merge(:value => value))
            end
          end
        end
      end
    end

    module ClassMethods
      def validates_associated_bubbling(*attr_names)
        validates_with AssociatedBubblingValidator, _merge_attributes(attr_names)
      end
    end
  end
end

然而它实际上遇到了一个错误:

undefined method `valid?' for #<TicketType::ActiveRecord_Associations_CollectionProxy:0x007ff86474a478>

任何人都可以帮助完成这个几乎可以解决的工作!?

完整的错误轨迹是:

undefined method `valid?' for #<TicketType::ActiveRecord_Associations_CollectionProxy:0x007ff8646ba148>

Extracted source (around line #6):
4
5
6
7
8
9

      def validate_each(record, attribute, value)
        (value.is_a?(Array) ? value : [value]).each do |v|
          unless v.valid?
            v.errors.full_messages.each do |msg|
              record.errors.add(attribute, msg, options.merge(:value => value))
            end

Rails.root: /Users/andyarmstrong/Documents/Personal/clazzoo_main

Application Trace | Framework Trace | Full Trace
config/initializers/associated_bubbling_validator.rb:6:in `block in validate_each'
config/initializers/associated_bubbling_validator.rb:5:in `each'
config/initializers/associated_bubbling_validator.rb:5:in `validate_each'
app/controllers/events_controller.rb:158:in `block in create'

最佳答案

value 实际上不是一个Array,而是一个ActiveRecord::Associations::CollectionProxy

所以...

value.is_a?(数组) ?值:[值] #=> [值]

[value].each do |v|
  unless v.valid?
    # ......
  end
end

会引发该错误

undefined method `valid?' for #<TicketType::ActiveRecord_Associations_CollectionProxy:0x007ff86474a478>

你可以试试这个:

module ActiveRecord
  module Validations
    class AssociatedBubblingValidator < ActiveModel::EachValidator
      def validate_each(record, attribute, value)
        ((value.kind_of?(Enumerable) || value.kind_of?(ActiveRecord::Relation)) ? value : [value]).each do |v|
          unless v.valid?
            v.errors.full_messages.each do |msg|
              record.errors.add(attribute, msg, options.merge(:value => value))
            end
          end
        end
      end
    end

    module ClassMethods
      def validates_associated_bubbling(*attr_names)
        validates_with AssociatedBubblingValidator, _merge_attributes(attr_names)
      end
    end
  end
end

关于ruby-on-rails - Rails validates_associated 与模型的错误信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31915921/

相关文章:

ruby-on-rails - rails Carrierwave 和 s3 : wrong number of arguments (2 for 1)

ruby-on-rails - Rails 包含何时添加的方法

ruby - "map"方法在 Ruby 中有什么作用?

java - java中的业务数据验证方法

java - Hibernate Validator 验证集

jquery - 使用 Capybara/Cucumber 单击链接

javascript - Rails 上 .js.erb 文件中的 Ruby 数组到 js 数组

ruby-on-rails - Ruby - 为什么这个回调函数不起作用

ruby - 将时间序列值的 Ruby 数组映射到加权间隔

Jquery如果输入为空则添加值并提交