繁体   English   中英

Rails 5:如何处理多个条件

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

我试图通过定义常见条件来缩短它:

应用控制器.rb

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM