自定义操作的Rails验证

Rao*_*oot 3 ruby-on-rails ruby-on-rails-3

我知道你可以这样做:

validates :cat_no, :presence => true, :on => :create
Run Code Online (Sandbox Code Playgroud)

我有一个自定义动作:

 def approve
    @product = Product.find(params[:id])
    @product.update_attribute :approved, true
    redirect_to product_path(@product)
 end
Run Code Online (Sandbox Code Playgroud)

我想这样做:

validates :cat_no, :presence => true, :on => :approve
Run Code Online (Sandbox Code Playgroud)

这似乎不起作用.有一个简单的方法吗?

Chr*_*erg 11

我认为你误解了验证的想法.验证是由模型的更改(通过save,createupdate)触发,而不是由控制器操作approved触发,因此在您的情况下让您的操作触发验证是没有意义的.

看看你的代码,在我看来你真正想要做的是cat_no在模型更新的时候运行验证,条件是approved刚刚变成的值true(即你的approve行动的第2行@product.update_attribute :approved, true).

我认为下面的代码应该实现:

validates :cat_no, :presence => true, :on => :update, :if => :just_approved?

def just_approved?
  changed.include?("approved") && approved?
end
Run Code Online (Sandbox Code Playgroud)

更新:

回想起来,上面的验证可能比你真正想要的更宽松.如果您有批准的记录并且您更改cat_nonil,则它将进行验证,因为approved未更改(因此changed.include?("approved")将评估为false).

更有可能这是你真正想要的:

validates :cat_no, :presence => true, :on => :update, :if => :approved?
Run Code Online (Sandbox Code Playgroud)