2016-11-15 70 views
1

我有一個簡單的切換的#active屬性相反的布爾狀態的動作:如何在控制器動作切換布爾屬性

  • 如果@blog.active == true然後update它爲無效
  • 如果@blog.active == false然後update它主動

我得到了一個控制器開始工作下列自定義操作,但必須有一些Rails的方式更優雅做到這一點:

是否存在將布爾型屬性更新爲相反布爾型狀態的Rails方法?

+1

'@ blog.update(active:[email protected]?)''? –

回答

1

這裏有兩件事情促成的你從這段代碼獲得這個意義上說:

  1. 所需動作的優雅和簡潔(「切換active布爾值」)不符合代碼的優雅和簡潔。
  2. 一目瞭然,這不是明顯的你在做什麼,而不在你的腦袋「運行代碼」(假設命名的方法你這裏是S.O.的緣故,實際上不是一個單獨的控制器動作)。

該溶液到兩個是一個命名的方法。我認爲它使對模型的意義,就像這樣:

class Blog < ApplicationRecord 
    def toggle_active! 
    update active: !active 
    end 
end 

# controller 
@blog = Blog.find(1) 
@blog.toggle_active! 

它現在在這兩個模型和正在發生的事情,因爲名稱/標籤,toggle_active,有沒有添加上下文和清晰度控制器清楚。此外,控制器不需要知道太多關於該方法的實施方式,其允許Blog改變在將來如何發生這種情況。

4

這應該工作:

@blog.update(active: [email protected]?) 

!是你的朋友:

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

的ActiveRecord有toggletoggle!方法,它做到這一點。請記住,toggle!方法會跳過驗證檢查。

class BlogsController < ApplicationController 

    ...  

    def toggle_active 
    @blog.toggle!(:active) 
    end 

end 

如果你想運行驗證,你可以做

@blog.toggle(:active).save 

你可以閱讀源代碼的方法here

+0

這應該被接受的答案。除了Rails已經提供的其他東西外, – Sebastialonso

3

活動記錄的toggletoggle!方法處理切換布爾屬性:

def toggle_active 
    @blog.toggle(:active).save 
end 
def toggle_active 
    @blog.toggle!(:active) 
end 

toggle更改屬性,但不會將更改保存到數據庫(因此需要單獨調用savesave!)。

toggle!更改屬性並保存記錄,但繞過模型的驗證。

+0

我在2秒鐘前完成相同的確切答案,得到一個答案嗎?我們如何想出了幾乎相同的答案在精確的同一時間:) – robertoplancarte

+0

@robertoplancarte upvotes爲你們兩個,謝謝你幫我用簡單的答案很有趣:-) –