[英]Rails 5: How to DRY Multiple Conditions
我有許多用戶類型,它們都在視圖中顯示不同的內容:
- if current_user.type == 'newbie' || current_user.type == 'super_admin'
| Button A
- if current_user.type == 'regular' || current_user.type == 'experienced' || current_user.type == 'admin' || current_user.type == 'super_admin'
| Button B
- if current_user.type == 'experienced' || current_user.type == 'manager' || current_user.type == 'admin' || current_user.type == 'super_admin'
| Button C
...
我試圖通過定義常見條件來縮短它:
def user_is_admin
current_user.type == 'admin' || current_user.type == 'super_admin'
end
- if current_user.type == 'regular' || current_user.type == 'experienced' || user_is_admin
| Button B
但我收到一個錯誤:
Did you mean? user_signed_in?
作為一個快速解決方案,比如:
- if ['newbie', 'super_admin'].include?(current_user.type)
| Button A
- if ['regular', 'experienced', 'admin'].include?(current_user.type)
| Button B
- if ['experienced', 'manager', 'admin'].include?(current_user.type)
| Button C
為了跟進 Shiko 的回答,我不會親自將此邏輯放入模型中,因為我將模型嚴格限制為數據訪問(這是業務邏輯)。 但是,這是個人喜好的問題。
相反,我很想把它放在一個decorator
。 但這是一個更長的討論。
正如@jvillian 提到的.include?
,還有正則表達式選項
<%= button B if current_user.type =~ /^(regular|experienced|admin)$/ %>
要正確實現問題中的代碼,您需要將代碼添加到模型而不是控制器中,如下所示:
class User
def is_admin
# by the way, type is a reserver word in AR
type == 'admin' || type == 'super_admin'
end
end
注意:
您可以從Controller類訪問application_controller方法,因為它們繼承自應用程序控制器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.