2016-08-10 5 views
0

私は、Rails 4.2アプリケーションでCanCanCanを使ってユーザーの役割を変更するためのドロップダウンを持っています。文字列のUser :: ROLES配列には、ユーザーが持つ可能性のあるさまざまな役割があります。ドロップダウンにロールを表示するには、次のCanCanCanロールを管理できるロールのドロップダウンに表示

<%= f.select :role, options_for_select((User::ROLES), @user.role) %> 

は、私が現在サインインCanCanCanに応じて、ユーザcan :manage役割へのドロップダウンオプションを制限したいです。現在のユーザーに:manage権限のないロールをドロップダウンに入力しないでください。どんな指導も高く評価されます。

編集:文字列リテラルと比較する場合

ショーン・フーバーの答えは完璧です。しかし、ユーザーモデルでこの配列を定義することが問題であることがわかりましたが、私は、ability.rbで1レベル深く設定されているロールと比較する必要があります。 Userモデルのパーミッションがability.rbに設定されている例を次に示します。

これは理にかなっていますが、User :: ROLES配列のリテラルと比較すると実際にはうまくいかないことがわかりました。

ロールアクセスを設定するコードはability.rbのようになります。私は、指定された特定の役割に対してチェックする必要があります。

if user.role? :superadmin 
    can :manage, User, role: 'admin' 
end 

にはどうすれば:superadminトークン化された役割がUser::ROLESに代わりリテラルのオーバー:manageのアクセス権を持っていることを特定の役割と比較することができますか?

User.rbからのロールの定義:アクションは、あなたのコントローラで実行されているものは何でも

ROLES = %w[student teacher school district reseller admin superadmin god]

+0

を? –

+1

ユーザーが管理できる@TallPaulの役割は、 'app/models/ability.rb'クラスに保持されます。質問を例で更新しました。 – gnycl

+0

あなたの編集が与えられたら、この質問に対する答えを見てみたいでしょう:http://stackoverflow.com/questions/9809203/get-a-string-that-represents-a-users-cancan-abilities –

答えて

0

@userフィールドを設定し、いくつかのコードを持っている必要がありますし、あなたのビューで使用可能な役割のコレクションを組み立て。あなたのケースでは、コントローラーメソッドで、ビューに渡されるコレクションにどのような役割を含めるべきかを決定することです。

最も簡単な方法は、役割を繰り返し、CanCanCanを使用してテストし、options_for_selectが使用できるフィルタリングされたコレクションに追加します。ここで

def some_method 

    @user = User.find(params[:id]) 
    @roles = Array.new 

    User::ROLES each do | role | 
    if can? :manage role 
     @roles.push(role) 
    end 
    end 

end 
0

は、1行のソリューションです:

<%= f.select :role, options_for_select(User::ROLES.map{|r| can?(:manage, r) ? r : nil}.compact, @user.role) %> 
+0

これは完璧です元の質問をこの解決策の問題で更新しました。 – gnycl

0

私はこの解決するためにtakeを使用して終了:どのようにあなたは、彼らが管理できる役割を知っています

<%= f.select :role, options_for_select(User::ROLES.take(User::ROLES.index(current_user.role)), @user.role) %>

+0

どうすればよいですか? –

+1

配列から渡された要素の数を取得します。ここでは、 'current_user.role'をインデックスとして使用して取得します。私の役割は 'User :: ROLES'配列の昇順になっているので動作します。 http://ruby-doc.org/core-2.3。1/Enumerable.html#method-i-take – gnycl

関連する問題