2016-08-07 4 views
0

私はRuby on Rails 5を使用しています。ユーザーの役割に応じて、ユーザーは5 Postsまたは10または15を投稿できます。これは、確認する必要があるいくつかの可能性のある状況の一部です認可(例えばポストではないものについては、もう少し複雑な状況があります)、私は数日前にCancancan(v1.15.0)を使用してUserモデルをあまりにも大きくしないようにしました。私は各役割ごとに1つのクラスを持っていますし、能力の中にもあります。私は役割に応じてクラスをマージします。ユーザがそのアクションを呼び出すたびに、Ruby on RailsでCancancanの権限を確認する方法はありますか?

問題は、Cancancanを使用すると明らかに認証を1回だけチェックするということです。コードの最初の行が作成たとえば、郵便番号では、ポストを作成するには:ユーザーの役割のクラスで

authorize! :create, Post 

、私はこのコードを持っている:

if user.posts.size < 10 
    Rails.logger.debug "If-size: #{user.posts.size}" 
    can :create, Post 
    else 
    Rails.logger.debug "Else-size: #{user.posts.size}" 
    cannot :create, Post 
    end 

を私はしていくつかのテストを持っていますRSpecと私は、その特定の役割を持つcurrent_userが初めてコントローラを使用してPostを作成するのを見る(私はFactoryGirlやコントローラを使用していない方法ではない)、それはlog/test.log :

If-size: 0 

しかし、ElseもIfもログには表示されません。コントローラーによって作成された投稿の数は関係ありません。初めて条件を評価するだけで、ユーザーは必要な数の投稿を作成できます最初にIfの条件が真であり、コントローラPostのメソッド作成が呼び出されるたびに評価されないためです。

EDIT:MarsAtomicが提案する方法で解決されます。ありがとう! :)

+0

こんにちはマルタとスタックオーバーフローを歓迎します。答えがあなたを助けてくれたなら、その左側のチェックマークを見て、それをクリックして他の人にあなたを助けたものを見せてください。将来、人々は同じ問題に遭遇し、新しい質問を掲示する代わりにあなたの質問を読むことで恩恵を受けることができることを覚えておいてください。 – MarsAtomic

答えて

0

CanCanCanは、アプリケーション内の条件に基づいてロールを動的に評価するものではありません。このタイプの機能は、認可ツールではなく、アプリケーションの独自のロジックで最もよく処理されます。

rolesテーブルに、特定の役割が許可されている投稿の数を示す列を追加することを検討する必要があります。この列を使用すると、各ユーザー(役割を介して)が作成できる投稿の数を確認できます。

次に、あなたのposts_controller.rbでは、ユーザーが許可されるポストの最大数を超えていない場合にのみ実行されますブロックであなたのポストの作成ロジックをラップすることができます

def create 
    if user.posts.size < user.role.max_posts 
    @post = Post.new(post_params) 

    @post.save 
    redirect_to @post 
    else 
    # flash an error on the page or redirect to an error page 
    end 
end 
関連する問題