我有一个简单的切换属性#active
到对面的布尔状态的动作:
@blog.active == true
然后update
它为无效@blog.active == false
那么update
活跃我有一个控制器开始工作下列自定义操作,但必须有一些Rails的方式更优雅做到这一点:
class BlogsController < ApplicationController
...
def toggle_active
if @blog.active?
@blog.update(active: false)
else
@blog.update(active: true)
end
end
end
是否有更新的布尔属性相反的布尔状态的Rails的方式吗?
Rails提供toggle
这一点,但它不是原子,你仍然要调用save
并考虑验证。该邦的方法替代,将处理持久你,但验证被跳过。
它可能会更好更明确一些你想在这里做什么。如果这个动作是一个表单POST或XHR请求的结果,接受你想设置(REST风格的),而不是预期的客户端要知道数据库的当前状态的实际值。
因此,虽然这个工程:
@blog.toggle(:active)
...它的非确定性,并且可能导致发生所需的动作是相反的。我反而建议如下:
class BlogStatusController < ApplicationController
# ... boilerplate to load @blog
def update
@blog.update(status_params)
end
protected
def status_params
params.require(:blog).permit(status: [:active])
end
end
如果你需要一个原子切换,你可以很容易地包裹在一个方便的方法名称的SQL语句实现它:https://stackoverflow.com/a/24218418/203130
ActiveRecord的有toggle
和toggle!
方法,它做到这一点。只要记住,该toggle!
方法跳过验证检查。
class BlogsController < ApplicationController
...
def toggle_active
@blog.toggle!(:active)
end
end
如果你想运行验证,你可以做
@blog.toggle(:active).save
你可以阅读源代码的方法here