1

だから私がやりたいのは、の役割に基づいてリダイレクトを行うことですcurrent_user.

これは私が持っているものです:

  path = case current_user.roles.where(:name => "vendor")
    when :vendor
      dashboard_path
    when :guest
      home_path
    else
      home_path
  end

  redirect_to path     

私が使用cancanしていて、私が知っているユーザーの役割を把握する唯一の方法は、current_user.has_role? :adminまたはを実行することですcurrent_user.roles.where(:name => role_name)

これらの制約がある場合 (または、ユーザーの役割を把握する別の方法を教えてください)、この case ステートメントを機能させるにはどうすればよいでしょうか?

編集 1

ここにある 2 つだけでなく、複数の役割をチェックしていると仮定します。4 つまたは 5 つになる可能性があります。

編集 2

明確にするために、これが私の現在の設定です。

私はDevise、CanCan、Rolifyを使用しています。Rolify を使用すると、ユーザーは複数のロールを持つことができますが、私のアプリケーションにはそのユース ケースがありません。ユーザーには 1 つのロールしかありません。のいずれかになりますvendor, buyer, guest, superadmin

の場合、自分に属するvendorのみが表示されます。dashboard_path彼らは他のvendor storefront誰かに属している他のものを見ることができません。また、他のベンダーの製品を見ることもできません。そのため、一度ログインすると、他のすべてのロールのようになるroot_pathべきではありdashboard_pathません。home_pathroot_path

彼らが の場合guest、彼らは価格以外のすべてを見ることができます - 私はすでにこのロジックが機能しています。私はこれを次のように達成しました:

if user.has_role? :guest
    can :read, [Product, Vendor, Banner]
    cannot :view_prices, Product
end

それから私の見解では、私はちょうどこのようなことをしました:

<% if can? :view_prices, Product %>
    <div class="price pull-right">
      <%= number_to_currency(@product.price) %> ea
    </div>      
<% else %>
   <span class="no-price pull-right"><%= link_to "Log In To See Price", login_path %></span>
<% end %>

root_pathつまり、基本的に...私の本当の目標は、ユーザーの役割に応じて変更しようとすることです。私は基本的にこの質問に対する答えを実装しようとしています。

4

2 に答える 2

6

FINAL ANSWER (以前の回答者については、以下を参照してください)

ユーザーが 1 つの役割しか持てない場合、現在の実装は適切ではないと思います。ただし、この実装を本当に維持する必要がある場合は、次のようにすることができます。

class User < ActiveRecord::Base
  # this will return the name of the first (so the only one) 
  # role that your user has, or nil. 
  def role_name
    roles.first.try( :name ) 
  end
end  

したがって、ケースステートメントは機能します:

path = case current_user.role_name
         when 'vendor' ; dashboard_path
         when 'guest'  ; home_path
         when 'foo'    ; bar_path
         else home_path
       end

再利用性とメンテナンスを容易にするために、case ステートメントをヘルパーでラップすることをお勧めします。

以前の回答

私はあなたの質問を理解しているかどうかわかりませんが、ここではケースステートメントは必要ないと思います:

redirect_to (current_user.has_role? :vendor ? dashboard_path : home_path)

もう 1 つの方法は、責任の一部をユーザー クラス (またはプレゼンター) にプッシュすることです。

class User < ActiveRecord::Base
  def home_page
    # here some logic to return a symbol like :home or :dashboard,
    # depending on your roles implementation. Your User could even use
    # a state machine to do this, or have multiple decorators.
  end
end

それからヘルパーと

 def home_path_for( user )
   case user.home_page
     when :home      ; home_path
     when :dashboard ; dashboard_path
     when :foo       ; bar_path
     else home_path
   end
 end

最初の編集

ユーザーが一度に複数の役割を持つことができる場合、case ステートメントは適切ではないと思います。可能性のある一連の結果のうち、入力が 1 つだけで、結果が 1 つしかcaseない場合に適した分岐ステートメントです。

したがって、ロールのリストを中間状態に減らす必要があります。たとえば、次のようになります。

 DASHBOARD_ROLES = [:vendor, :admin]
 CLIENT_ROLES    = [:client, :prospect]
 BASIC_ROLES     = [:logged_visitor]

 if (DASHBOARD_ROLES & user_roles).any?
   :admin_dashboard
 else if (CLIENT_ROLES & user_roles).any?
   :client_dashboard
 # additionnal, different logic is possible
 else if (BASIC_ROLES & user_roles).any? && user_logged_in? && user_roles.first != :prospect
   :logged_dashboard
 else
   :home
 end

これはまったく異なる種類のロジックです。

于 2013-03-15T08:24:20.387 に答える
1

まず、可能であれば、ユーザーが複数の役割を持っている場合に対処する必要があります。

ユーザーが 1 つのロールを持っていると仮定します (ただし、必要に応じて条件を追加できます) ハッシュを検討できますか?

何かのようなもの -

path = {:vendor => dashboard_path, :guest => home_path} [current_user.active_role] || default_path

私はいくつかの仮定をしました -

  1. current_user.active_role回答をリダイレクトできるユーザーの現在の役割である可能性があります。
  2. default_path自明です。
于 2013-03-15T08:23:50.670 に答える