我在控制器操作中有以下代码,它会查看用户,并将布尔值更改为相反的值,因此如果用户为true
,则它变为false
,副亦然:
if current_user.enable_access
current_user.update_attribute(:enable_access, false)
else
current_user.update_attribute(:enable_access, true)
end
有没有更简洁的方式来写这个?
答案 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中的true
和false
分别是不同类的实例,TrueClass
和FalseClass
。也就是说,人们不能只在原地切换布尔值。
但我们可以想象,在update_attribute
source进行调解?这可能是完成任务的最短途径(请不要在家里使用它,毕竟这是一个笑话。)
current_user.tap do |cu|
cu.enable_access ^= true
end.save validate: false
我刚刚重新发明toggle!
,感谢@Dremni指出这一点。
答案 4 :(得分:1)
current_user.toggle!(:enable_access)
http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-toggle-21
答案 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