2

私はポーリングアプリに取り組んでおり、認証と承認にDeviseとCancanを使用しています。Devise によって生成された User モデルと Poll モデルがあります。投票はユーザーに属します。私の問題は、Polls コントローラーにカスタム アクションがあり、そのカスタム アクションで Cancan を動作させることができないことです。これは私が私のコードでやろうとしたことです:

config/routes.rb:

match 'users/:user_id/polls' => 'polls#show_user'

アビリティ.rb:

def initialize(user)
  user ||= User.new

  if user.is? :admin
    can :manage, :all
  else # default
    can :read, :all
    can :manage, Poll, :user_id => user.id
    can :show_user, Poll, :user_id => user.id
  end # if else admin
end

polls_controller.rb:

class PollsController < ApplicationController
  before_filter :authenticate_user!
  load_and_authorize_resource :except => :show_user

  def show_user
    authorize! :show_user, user
    @polls = Poll.find_all_by_user_id(params[:user_id])
    render "index"
  end
  <...>
end

アイデアは、投票の所有者がサインインしている場合にのみユーザーの投票を表示できるということです。ただし、このコードでは、投票の所有者がサインインしている場合、そのユーザーはそのページから追い出され、認証に失敗したというメッセージが表示されます。 . 行を削除すると、authorize! :show_user, userサインインしているユーザーは他のすべてのユーザーの投票を表示できます (承認はまったく機能しません)。

私が見逃している可能性のあるものを誰かが見ることができますか? 前もって感謝します!

4

1 に答える 1

2

ではabiltity.rb、動詞と名詞の組み合わせは:show_userandPollですが、コントローラーでは and を使用しています:show_user--代わりにusera を使用する必要がありますPoll

代わりに、ユーザーが自分Pollのすべての を表示できるようにする場合は、次のようにします。

ability.rb:

can :show_polls_for, User, :id => user.id

polls_controller.rb:

def show_user
  authorize! :show_polls_for, user
  ...
end
于 2012-11-24T09:29:52.623 に答える