1

这里非常基本的问题,我需要在我的类别模型上编写一个前置过滤器,以确保深度永远不会超过 2。这是我到目前为止所拥有的。

应用程序/模型/category.rb

before_create :check_depth
  def check_depth
    self.depth = 1 if depth > 2
  end

我需要它而不是将深度设置为 1,只是为了返回一条错误消息,但我什至无法让当前的设置正常工作,我得到了错误

undefined method `>' for nil:NilClass

所以,与其将深度设置为我试图做的那样,我将如何发送错误?以及使当前功能用于信息目的的任何帮助?提前致谢

4

3 回答 3

5

有多种方法可以做到这一点。

最直接的解决方案:

def check_depth
  self.errors.add(:depth, "Issue with depth") if self.value > 2 # this does not support I18n
end

最干净的是使用模型验证(在 category.rb 的顶部,只需添加):

validates :depth, :inclusion => { :in => [0,1,2] }, :on => :create

如果您的验证逻辑变得更复杂,请使用自定义验证器:

# lib/validators/depth_validator.rb (you might need to create the directory)
class DepthValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    record.errors.add(attribute, "Issue with #{attribute}") if value > 2 # this could evene support I18n
  end
end

在使用这个验证器之前,你需要在初始化器中加载它

# config/initializers/require_custom_validators.rb
require File.join('validators/depth_validator')

在更改之后(以及在验证器中进行任何更改之后),您需要重新启动您的 rails 服务器。

现在在您的类别模型中:

validates :depth, :depth => true, :on => :create # the :on => :create is optional

该问题将被提出,@category.save因此您可以像这样设置您的 Flash 通知:

if @category.save
  # success
else
  # set flash information
end
于 2012-04-15T07:28:28.403 回答
2

我会推荐简单明了的方法:

# in your Comment.rb
validates_inclusion_of :depth, in: 0..2, message: "should be in the range of 0..2"
于 2012-04-15T07:43:54.097 回答
1

你现在得到的错误是因为depth是 nil。我相信您想使用self.depth,例如:

def check_depth
    self.depth = 1 if self.depth > 2
end

我不太确定发送错误是什么意思...在哪里发送错误?你是模特...

于 2012-04-15T05:39:59.660 回答