2015-10-13 59 views
0

我在控制器操作中查看用户,并将布尔值更改为相反的值,因此如果用户为true,那么它将变为false,反之亦然:在Ruby中的两个布尔值之间切换

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

有没有更好的方式来写这个?

回答

5

在一个行,如果current_user.enable_access只能true`FALSE`:

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

你的意思'current_user.update_attribute(!enable_access,current_user.enable_access)'(注意!)这就是 –

+0

这么漂亮我可能正好落在我的膝盖和喜悦哭泣。谢谢:) –

+4

Gareth,尽量克制自己。如果每当你发现Ruby的一些酷炫的东西,那么你会对你的裤子感到厌烦。 –

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 

通知!!,这是把一个值的便捷方法成真/假:

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 

T这些是Ruby中比较的基石。

4

如何使用专门为此设计的toggle方法?

current_user.toggle(:enable_access) 

如果你想在一个字符添加持久性,另外还有toggle!方法。

current_user.toggle!(:enable_access) 
+0

'toggle'不会保存记录,而'update_attribute'。 'toggle!'只是一个语法糖,但是,是的,它是:) – mudasobwa

1

虽然通过@Зеленый回答是我不知道绝对正确的,有完成这样一个愚蠢的任务没有干法。

的问题是,在红宝石truefalse分别为不同的类,TrueClassFalseClass的实例。也就是说,人们不能仅仅在布置值上切换布尔值。

但是我们可以想象,调解在update_attribute source?也许这是完成任务的最短的方式(请不要在家中使用它,这是一个笑话毕竟。)

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

我刚刚改造toggle!,感谢@Dremni指出了这一点。