[英]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.