2012-04-06 5 views
1

ラップ天才では、特定のパーミッションを得る前に一定量のRap IQが必要です(この点に関してはStack Overflowのようなものです)。私は私のability.rbにこのような行を追加することで、これを実装しました:CanCan能力の要件をユーザに表示

can :create, Annotation do |a| 
    user.rap_iq >= 500 
end 

しかし、私はユーザーにこの事実を伝えることができるようにする必要があります。私は、この問題は解決されていると確信している - 私の質問はこれを実行する最善の方法である

<% unless can? :create, @annotation %> 
    You need at least <%= CanCan::Ability.iq_required_to(:create, Annotation) %> Rap IQ to create annotations 
<% end %> 

(明らかにAPIが笑作られる)

:私の注釈では例えば、私のようなものを持っているかもしれません表示します前に(例えば、スタックオーバーフローの場合!)

答えて

2

何らかの方法でこの要件情報をモデル化し、それをユーザーに表示することができます。

カンカンでこれを行う方法がすでに存在する場合、私は知りません(私はまだドキュメントでそれを見ていませんでした)がありますが、iq_required_toに(それだけでだようなものを応答するCanCan::Abilityクラスを拡張することができコンセプト)の証明:

REQUIREMENTS[:annotation][:create] = 500 

def iq_required_to(action, subject) 
    REQUIREMENTS[subject][action] 
end 

をして、あなたはもちろんのiq_required_to(:create, :annotation)

を呼び出すことができますが、この情報を使用するようにinitializeを変更する必要があります

can :create, Annotation do |a| 
    user.rap_iq >= iq_required_to(:create, :annotation) 
end 
+0

ええ、これは私がやっていることです。唯一の問題は、ユーザーが何もできないのかを判断する方法があることです。つまり、ユーザーが注釈を追加できないという非iq関連の理由がある可能性があります。このテクニックを使用すると、私のability.rbとビューの両方にIQ要件があることを覚えておく必要があります。これは私が避けようとしていることです。このドライを保つ考えはありますか? –

+0

もちろん、この "ソリューション"は他の種類の要件を考慮していませんが、あなたのアプリケーションがあなたが何をすることができるかを決定する主な方法だから、あなたの言ったようなシステムがあれば問題ありません。他の種類の認可制約に合致している場合は、このメッセージを表示できません(管理者になる必要がある場合は、管理者ではないことをユーザーに知らせてください)、わかりませんもし私が明らかであれば、ある程度以上の評判があれば、何かをするのに十分です。*これはOKです。 –

+0

CanCanコードを少し読んだところ、 'canCan:Ability'モジュール(' ability.rb'モデルに含まれています)には、CanCanがユーザーが何をすることができるかを確認するのに使う興味深い変数とメソッドがあります。私は '@規則'( 'CanCan :: Rule'インスタンスの配列)と' relevant_rules_for_query(action、subject) 'メソッド(' CanCan :: Rule'の配列)について説明しています。これらはどちらもプライベートですが、publicメソッドで 'why_cannot(action、subject)'と書くことができますが、原因を特定するためにルールを処理する必要があります( 'CanCan :: Rule'には' @条件 'ハッシュがあります)...先進的な(少なくとも私のために)、しかし多分*実行可能な –

関連する問題