在Ruby中切换两个布尔值

时间:2015-10-13 16:07:03

标签: ruby-on-rails ruby

我在控制器操作中有以下代码,它会查看用户,并将布尔值更改为相反的值,因此如果用户为true,则它变为false,副亦然:

  if current_user.enable_access
    current_user.update_attribute(:enable_access, false) 
  else
    current_user.update_attribute(:enable_access, true) 
  end

有没有更简洁的方式来写这个?

6 个答案:

答案 0 :(得分:5)

在一行中,如果current_user.enable_access只能是true`false`:

current_user.update_attribute(:enable_access, !current_user.enable_access) 

答案 1 :(得分:4)

如何使用专门用于此目的的toggle方法?

com.example.tirengarfio.myapplication

如果你想在一个角色中添加持久性,还有toggle!方法。

current_user.toggle(:enable_access)

答案 2 :(得分:3)

这里需要冥想:

false # => false
true # => true

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

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

foo = nil # => nil
!foo # => true

foo = !nil # => true
foo = !false # => true

注意!!,这是将值转换为true / false的便捷方式:

foo = !!nil # => false
foo = !!false # => false

foo = 1 # => 1
!foo # => false
!!foo # => true

foo = 'a' # => "a"
!foo # => false
!!foo # => true

0 == 1 # => false
1 == 1 # => true

'a' == '' # => false
'a' == 'a' # => true

这些是Ruby中比较的构建块。

答案 3 :(得分:1)

虽然@Зеленый的答案绝对正确,但我想知道,没有干嘛的方法来完成这么愚蠢的任务。

问题是Ruby中的truefalse分别是不同类的实例,TrueClassFalseClass。也就是说,人们不能只在原地切换布尔值。

但我们可以想象,在update_attribute source进行调解?这可能是完成任务的最短途径(请不要在家里使用它,毕竟这是一个笑话。)

current_user.tap do |cu|
  cu.enable_access ^= true
end.save validate: false

我刚刚重新发明toggle!,感谢@Dremni指出这一点。

答案 4 :(得分:1)

答案 5 :(得分:1)

我相信使用DRY的方法是使用:

current_user.enable_access = !current_user.enable_access

然后,您可以在模型上编写一个方法,然后从任何控制器调用它。

user.rb

def enable_user_access
    self.enable_access = !self.enable_access
end

然后从控制器调用它

current_user.enable_user_access