0

モデルを設定し、search少なくとも1つのフィールドに入力する必要があります。Railsの検証に役立つ質問を見つけました。少なくとも1つのフィールドを空白にしないようにする方法。(私はすべての答えを試しましたが、Voytaのものが最高のようです。)

attr_accessorまたはを介してゲッター/セッターを再定義する場合を除いて、検証は機能していattr_writerます。(検証の一部である必要があるフォーム上の仮想属性があります。)問題が何であるかを理解するために、通常の属性である属性を使用してテストしましたitem_length。追加するattr_accessor :item_lengthと、検証が機能しなくなります。したがって、問題は、ドット表記を使用せずに属性の値を読み取る方法だと思います。検証では文字列を使用するため、通常の読み取り方法を使用できません。

スニペットは次のとおりです。

if %w(keywords 
      item_length 
      item_length_feet 
      item_length_inches).all?{|attr| read_attribute(attr).blank?}
    errors.add(:base, "Please fill out at least one field")
  end

私が言ったように、仮想属性(length_inchesとlength_feet)はまったく機能せず、ゲッター/セッターを再定義しない限り、通常の属性(length)は機能します。

4

2 に答える 2

7

read_attributeは、ActiveRecord列を読み取るためのプライベートメソッドと見なす必要があります。それ以外の場合は、常にリーダーを直接使用する必要があります。

self.read_attribute(:item_length) # does not work
self.item_length # ok

これを動的に呼び出そうとしているので、一般的なrubyメソッドを使用public_sendして指定されたメソッドを呼び出すことができます

self.public_send(:item_length) # the same as self.item_length
于 2012-08-25T23:29:41.307 に答える
6

コメントで述べたように、send

array.all? {|attr| send(attr).blank?}

この場合は大丈夫かどうか疑問に思っている人にとってsendは、そうです。オブジェクトは独自のインスタンスメソッドを呼び出します。

ただしsend、これは鋭いツールであるため、他のオブジェクトで使用する場合は常に、それらのパブリックAPIを使用するようにしてください。public_send

于 2012-08-25T23:31:06.823 に答える