如何切换控制器中的动作布尔属性

问题描述 投票:6回答:5

我有一个简单的切换属性#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的方式吗?

ruby-on-rails ruby
5个回答
7
投票

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


17
投票

活动记录的toggletoggle!方法手柄切换布尔属性:

def toggle_active
  @blog.toggle(:active).save
end
def toggle_active
  @blog.toggle!(:active)
end

toggle改变属性,但不会将更改保存到数据库中(这样一个单独的呼叫save或需要save!)。

toggle!更改属性并保存记录,但绕过模型的验证。


5
投票

这应该工作:

@blog.update(active: [email protected]?)

!是你的朋友:

!false # => true
!true # => false

5
投票

ActiveRecord的有toggletoggle!方法,它做到这一点。只要记住,该toggle!方法跳过验证检查。

class BlogsController < ApplicationController

  ...    

  def toggle_active
    @blog.toggle!(:active)
  end

end

如果你想运行验证,你可以做

@blog.toggle(:active).save

你可以阅读源代码的方法here


2
投票

你可以试试这个:

@blog.update(active: [email protected]?)

这是相当紧凑。

© www.soinside.com 2019 - 2024. All rights reserved.