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,create或update)触发,而不是由控制器操作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_no为nil,则它将进行验证,因为approved未更改(因此changed.include?("approved")将评估为false).
更有可能这是你真正想要的:
validates :cat_no, :presence => true, :on => :update, :if => :approved?
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7455 次 |
| 最近记录: |