CanCanCan: способность читать, но может обновлять и создавать

У меня есть вложенный ресурс в пространстве имен

namespace :myns do
  resources :dashboards do
    resources :advertisements
  end
end

Я добавил check_authorization в контроллер приложений, и контроллеры настроены

class Myns::DashboardsController < ApplicationController
  load_and_authorize_resource :myns_dashboard, class: Myns::Dashboard
end

class Myns::AdvertisementsController < ApplicationController
  load_and_authorize_resource :myns_dashboard, class: Myns::Dashboard
  load_and_authorize_resource :myns_advertisement, class: Myns::Advertisement, :through => :myns_dashboard

И класс способности:

class Ability
  include CanCan::Ability

  def initialize(user, dashboard_id)
    user ||= User.new # guest user (not logged in)

    can :show, Myns::Dashboard, id: dashboard_id
    can :read, Myns::Advertisement, :myns_dashboard => { :id => dashboard_id }
  end
end

Когда я загружаю возможность для пользователя в консоли и спрашиваю, может ли этот пользователь обновить рекламу с идентификатором 6, он говорит «нет».

user = User.first
ability = Ability.new(user,  1)
advertisement = Myns::Advertisement.find 6
ability.can? :update, advertisement
=> false

Но когда я открываю свой браузер, вхожу в систему как пользователь с идентификатором 1 и перехожу непосредственно к http://localhost/myns/dashboards/1/advertisements/6/edit сайт отображается без ошибок. Я могу редактировать поля и отправлять изменения, и они сохраняются в базе данных.

Я также могу открыть http://localhost/myns/dashboards/1/advertisements/new и создайте новые наборы данных.

Очевидно, я что-то упустил... Что?


person Christian    schedule 05.12.2016    source источник
comment
первое, что бросается в глаза, это отсутствие кавычек вокруг пространство имен. Вы также можете попробовать выполнить отладку на уровне метода контроллера, чтобы увидеть, возвращает ли он то же самое, что и консоль rails. Мой вопрос, я думаю, также заключается в том, есть ли какие-либо общедоступные методы на этом контроллере? если да, то почему бы просто не попросить пропустить их и просто упростить до load_and_authorize_resource, class: Myns::Dashboard   -  person Tall Paul    schedule 05.12.2016
comment
Я думаю, потому что ему нужен референт для утверждения through.   -  person Joe Atzberger    schedule 15.12.2016
comment
Я удаляю CanCanCan Gem из этого проекта и пишу свою авторизацию.   -  person Christian    schedule 15.12.2016


Ответы (1)


Вы переопределили current_ability в своем ApplicationController, чтобы передать этот второй параметр вашему конструктору Ability? Я не уверен, как версия сервера получает ту же информацию, что и ваш пример консоли.

person Joe Atzberger    schedule 15.12.2016