簡體   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