2017-04-25 1 views
1

has_manyアソシエーションの一部の属性を検証するためにカスタムバリデータを作成しました。validates_withでのアソシエーションへのアクセス

私のクラス:

class User < ApplicationRecord  
    has_many :addresses 
    accepts_nested_attributes_for :addresses, allow_destroy: true 

    validates_with UniquenessMemoryValidator, 
       attributes: [:name], 
       collection: :addresses, 
       message: 'My custom message' 
end 

UniquenessMemoryValidator:(:アドレスこの場合)、それはnilを印刷し

class UniquenessMemoryValidator < ActiveModel::Validator 
    def validate(record) 
    attrs, message = options.values_at(:attributes, :message) 
    collection = record[options[:collection]] 
    puts "collection #{collection}" # it's nil 
    end 
end 

問題は、私は私の関連付けをアクセスしようとするということです。

私の質問は、バリエーターでの配列に "入れ子"にアクセスするにはどうすればいいですか?

PS:私の "レコード"の他の属性にはアクセスできません。それは通常のメソッド呼び出しのために動的にそれをしたい場合は、sendで試すことができ

答えて

1

collection = record.send(options[:collection]) 

また、あなたはreject_ifでのみaccepts_nested_attributes_for検証にネストされた配列にアクセスすることができます。 reject_ifには、ブロックまたはの方法を渡すことができます。

accepts_nested_attributes_for :addresses, reject_if: { |attrs| ... } 

#OR 
accepts_nested_attributes_for :addresses, reject_if: :my_method 

def my_method 
    #some logic that returns true for invalid record 
end 
+0

回答ありがとうございますが、これは私が達成しようとしているものではありません。私はクラスバリデータを作成し、そのクラスの*ネストされた*アソシエーションを使用してカスタム検証を実行したいと思います。あまりにも多くのattempsの後で、私は*問題を引き起こしているものを発見しました*:**大括弧構文**。私はこれを行う私のアソシエーションにアクセスすることができません: 'レコード[アサーション]'。ドットシンタックスを使用すると**動作します**一般的なバリデータ(ダイナミック)であるため、ドットシンタックスを使用できません。 –

+2

@ dev_054しかし、この場合、私が理解しているように 'record.send(assocation)'を使うことができます。 – idej

+0

それだけです。ありがとうございます。答えに追加することができますので、確認することができます。 –

関連する問題