加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 如何在控制器操作中切换布尔属性

发布时间:2020-12-17 01:55:17 所属栏目:百科 来源:网络整理
导读:我有一个动作,只需将#active属性切换到相反的布尔状态: 如果@ blog.active == true,则将其更新为非活动状态 如果@ blog.active == false,则将其更新为活动状态 我在控制器中得到了以下自定义操作,但是必须有一些Rails方法才能更优雅地执行此操作: class Bl
我有一个动作,只需将#active属性切换到相反的布尔状态:

>如果@ blog.active == true,则将其更新为非活动状态
>如果@ blog.active == false,则将其更新为活动状态

我在控制器中得到了以下自定义操作,但是必须有一些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并考虑验证. bang-method替代方案将为您处理持久性,但会跳过验证.

最好明确你想要做什么.如果此操作是表单POST或XHR请求的结果,请接受您要设置的实际值(RESTful),而不是期望客户端知道数据库的当前状态.

所以虽然这有效:

@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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读