2015-10-13 62 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指出了這一點。