【问题标题】:Rails validates_associated with model's error messageRails validates_associated 与模型的错误消息
【发布时间】:2015-11-02 03:40:05
【问题描述】:

我在一个模型中使用 validates_associated 来使用另一个模型的验证代码。问题在于验证失败的消息是“..is invalid”。

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

我发现了这个问题: 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'

【问题讨论】:

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


    【解决方案1】:

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

    所以...

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

    [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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-02
      • 2011-01-09
      • 1970-01-01
      • 2011-11-15
      • 2010-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多