自定义验证没有触发b / c我的ruby是不对的

时间:2011-02-02 23:18:11

标签: ruby ruby-on-rails-3

这是一个痛苦的菜鸟问题,但我不得不问。我希望验证在特定字段中跳转,我们称之为:token不是特定字符串。所以,我打电话给我的自定义验证:

validate :use_beta_token

然后我定义了我的验证方法

def use_beta_token
        errors.add(:token, "Incorrect beta token") if token not 'pizza'
end

每当我将令牌设置为不是“披萨”的字符串时,我使用valid?进行测试,它将返回true。我在这里搞砸了什么?我也试过了if token !== 'pizza',但那也不行。我确定答案很明显,但我似乎无法将其挖掘出来。

2 个答案:

答案 0 :(得分:3)

errors.add(:token, "Incorrect beta token") unless token == 'pizza'

not方法就像!,它是一个一元布尔运算符而不是二元比较运算符。

关于如何编写它们,保持简洁。有关示例,请参阅rails guide

答案 1 :(得分:0)

为Rails 3使用自定义验证器的一种方法是定义自己的Validator类,该类继承自ActiveModel :: Validator,然后实现validate方法并附加错误,如下所示:

# define my validator
class MyValidator < ActiveModel::Validator
  # implement the method where the validation logic must reside
  def validate(record)
    # do my validations on the record and add errors if necessary
    record.errors[:token] << "Incorrect beta token" unless token == 'pizza'
  end
end

定义验证器后,必须将其包含在模型中,以便可以使用它并将其应用于validates_with方法。

class ModelName
  # include my validator and validate the record
  include ActiveModel::Validations
  validates_with MyValidator
end