Невозможно получить доступ к действию в Rails даже с возможностью CanCanCan - PullRequest
0 голосов
/ 29 октября 2018

У меня есть следующее:

questions_controller.rb
class QuestionsController < ApplicationController
  load_and_authorize_resource #cancancan

  def index
    authorize! :view_all, @questions
ability.rb
class Ability
  include CanCan::Ability

  def initialize(user)
    ...
    elsif user.content_creator
      can [:index, :read, :create, :update], Unit
      can [:index, :read, :create, :update, :view_all], Question
routes.rb
  resources :units do
    resources :questions, only: [:index]
Log
Started GET "/units/1/questions" for ::1 at 2018-10-29 13:37:15 -0400
Processing by QuestionsController#index as HTML
  Parameters: {"unit_id"=>"1"}
  User Load (8.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1  ORDER BY "users"."id" ASC LIMIT 1  [["id", 13]]
You are not authorized to access this page.
Redirected to http://localhost:3000/dashboard

Я подтвердил, что пользователь content_creator. Я даже перезапустил сервер. Пользователь может обновить Unit. Однако они не могут просматривать указатель вопросов в этом блоке. Почему бы и нет?

Если я поставлю can :manage, Question в начале ability.rb, то он все еще не авторизован. Если я использую can :manage, :all, то это работает.

Канканкан ~> 1.10

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Я тоже был в подобной ситуации, посмотрев вокруг, я обнаружил следующее:

Выбор действий

class ProductsController < ActionController::Base
  load_and_authorize_resource
  def discontinue
    # Automatically does the following:
    # @product = Product.find(params[:id])
    # authorize! :discontinue, @product
  end
end

в соответствии с закомментированным текстом, cancancan по умолчанию ожидает, что имя действия будет равно способности, в вашем случае вам придется создать новое действие с именем

def view_all

или вам нужно будет создать подправило для индекса.

Надеюсь, это поможет.

0 голосов
/ 29 октября 2018

Я избавился от

# authorize! :view_all, @questions # prevents ContentCreators from viewing /units/1/questions

И изменилось

can :read, Question

К

can :show, Question

Везде в ability.rb, так что индекс могут видеть только авторизованные пользователи. Однако это не полный ответ, потому что все еще не ясно, почему оригинальный код не работал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...