使用包含来validation数组元素包含:{in:array}

我使用acts-as-taggable-on gem来填充用户对这样的用户兴趣

 # 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"]} 

我可以看到包含没有意识到它应该迭代数组元素而不是s考虑作为一个普通的字符串,但我不知道如何实现这一点。 任何的想法?

标准包含validation器不适用于此用例,因为它检查有问题的属性是否是给定数组的成员。 你想要的是检查数组的每个元素(属性)是否是给定数组的成员。

要做到这一点,你可以创建一个自定义validation器,如下所示:

 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 

通过获取这两个数组的差异,我得到的interest_list元素不在VALID_INTERESTS

我实际上没有尝试过这个代码所以不能保证它会起作用,但我认为解决方案看起来会像这样。