3

私はacts-as-taggable-ongemを使用して、Userこのようなモデルにユーザーの関心を設定します

# User.rb
acts_as_taggable
acts_as_taggable_on :interests

配列にデータを入力するときinterest_list、指定された値が定数配列と一致することを確認して、これらが受け入れられる値であることを確認する必要があります。

VALID_INTERESTS = ["music","biking","hike"]
validates :interest_list, :inclusion => { :in => VALID_INTERESTS, :message => "%{value} is not a valid interest" }

上記のコードは次のエラーを返します

@user = User.new
@user.interest_list = ["music","biking"]
@user.save
=> false …. @messages={:interest_list=>["music, biking is not a valid interest"]}

インクルージョンは、単純な文字列と見なすのではなく、配列要素を反復処理する必要があることを認識していないことがわかりますが、これを実現する方法がわかりません。何か案が?

4

3 に答える 3

12

問題の属性が特定の配列のメンバーであることをチェックするため、標準の包含バリデーターはこのユースケースでは機能しません。必要なのは、配列のすべての要素 (属性) が特定の配列のメンバーであることを確認することです。

これを行うには、次のようなカスタム バリデータを作成できます。

VALID_INTERESTS = ["music","biking","hike"]
validate :validate_interests

private

def validate_interests
  if (invalid_interests = (interest_list - VALID_INTERESTS))
    invalid_interests.each do |interest|
      errors.add(:interest_list, interest + " is not a valid interest")
    end
  end
end

これら 2 つの配列の差を取ることで、 interest_listnot inの要素を取得しています。VALID_INTERESTS

私は実際にこのコードを試していないので、動作することを保証できませんが、解決策は次のようになると思います.

于 2012-11-27T07:55:23.937 に答える