我有一個簡單的切換的#active
屬性相反的布爾狀態的動作:如何在控制器動作切換布爾屬性
- 如果
@blog.active == true
然後update
它爲無效 - 如果
@blog.active == false
然後update
它主動
我得到了一個控制器開始工作下列自定義操作,但必須有一些Rails的方式更優雅做到這一點:
是否存在將布爾型屬性更新爲相反布爾型狀態的Rails方法?
我有一個簡單的切換的#active
屬性相反的布爾狀態的動作:如何在控制器動作切換布爾屬性
@blog.active == true
然後update
它爲無效@blog.active == false
然後update
它主動我得到了一個控制器開始工作下列自定義操作,但必須有一些Rails的方式更優雅做到這一點:
是否存在將布爾型屬性更新爲相反布爾型狀態的Rails方法?
這裏有兩件事情促成的唉你從這段代碼獲得這個意義上說:
active
布爾值」)不符合代碼的優雅和簡潔。該溶液到兩個是一個命名的方法。我認爲它使對模型的意義,就像這樣:
class Blog < ApplicationRecord
def toggle_active!
update active: !active
end
end
# controller
@blog = Blog.find(1)
@blog.toggle_active!
它現在在這兩個模型和正在發生的事情,因爲名稱/標籤,toggle_active
,有沒有添加上下文和清晰度控制器清楚。此外,控制器不需要知道太多關於該方法的實施方式,其允許Blog
改變在將來如何發生這種情況。
的ActiveRecord有toggle
和toggle!
方法,它做到這一點。請記住,toggle!
方法會跳過驗證檢查。
class BlogsController < ApplicationController
...
def toggle_active
@blog.toggle!(:active)
end
end
如果你想運行驗證,你可以做
@blog.toggle(:active).save
你可以閱讀源代碼的方法here
這應該被接受的答案。除了Rails已經提供的其他東西外, – Sebastialonso
活動記錄的toggle
和toggle!
方法處理切換布爾屬性:
def toggle_active
@blog.toggle(:active).save
end
def toggle_active
@blog.toggle!(:active)
end
toggle
更改屬性,但不會將更改保存到數據庫(因此需要單獨調用save
或save!
)。
toggle!
更改屬性並保存記錄,但繞過模型的驗證。
我在2秒鐘前完成相同的確切答案,得到一個答案嗎?我們如何想出了幾乎相同的答案在精確的同一時間:) – robertoplancarte
@robertoplancarte upvotes爲你們兩個,謝謝你幫我用簡單的答案很有趣:-) –
'@ blog.update(active:[email protected]?)''? –