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 次 |
最近记录: |