1

ここでのかなり基本的な質問です。深さが 2 を超えないようにするために、Category モデルに before フィルターを記述する必要があります。

アプリ/モデル/カテゴリ.rb

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

エラーメッセージを返すために、深さを1に設定する代わりに必要ですが、この現在の設定を機能させることさえできず、エラーが発生します

undefined method `>' for nil:NilClass

それで、私がしようとしているように深さを1に設定する代わりに、代わりにどのようにエラーを送信しますか? そして、現在の機能を情報提供のために機能させるのに何か助けはありますか? 前もって感謝します

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次のようにフラッシュ通知を設定できるように発生します。

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ゼロだからです。次のように使用したいと思いますself.depth

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

エラーを送信するとはどういう意味かよくわかりません... どこにエラーを送信していますか? あなたはモデルに...

于 2012-04-15T05:39:59.660 に答える