3

と呼ばれるブール値を持つモデルがありますdraft

の場合にのみフィールドの存在を検証したいdraft == false

私のモデル

if self.draft == false
  validates :name, :presence => true, :length => { :maximum => 45 }
  validates :description, :presence => true
  validates :blurb, :presence => true, :length => { :maximum => 175 }
  validates :category_id, :presence => true
  validates :location_id, :presence => true
  validates :goal, :presence => true
else
end

私のコントローラーで

def new
  @item.new(:draft => false) || @item.new(:draft => true)

def create
  if params[:commit] == "Create Item"
    @cause = Item.new(params[:item], :draft => false)
  elsif params[:commit] == "Save Changes"
    @cause = Item.new(params[:item], :draft => true)
  end

私のifステートメントを完全に無視し、クリックするとtrueかどうかを検証しますSave Changes

提案をいただければ幸いです。

4

2 に答える 2

8

条件付き検証は次のようになります

validates :name, :presence => true, :length => { :maximum => 45 }, :if => :draft_is_false?

private
def draft_is_false?
   draft == false
end

同様に、他のフィールドで条件付き検証を実行でき、これらもグループ化できます。RubyonRailsガイドの条件付き検証のセクションを確認してください。

于 2012-07-17T19:09:36.987 に答える
0

新しいレール構文のワンライナーは次のとおりです。

validates :name, presence: true, length: { maximum: 45 }, if: -> (item) { item.draft? } 

下書き属性の後に疑問符があることに注意してください。Railsdraft?は、モデルのすべての属性のようなメソッドを自動的に作成し、基本的にはのショートカットですattr.present?。ブール属性とともに使用する場合、開発者の意図がtrue/falseをチェックすることであることを示唆しています。

于 2017-06-21T08:09:44.280 に答える