Проблема с Rails CanCanCan с контроллером без модели - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть простой метод контроллера: WelcomeController#dashboard, который предназначен для того, чтобы быть целевой страницей ПОСЛЕ того, как пользователь войдет в систему (у пользователя есть роль 'manager' для этого теста).

I'mНачнем с простого, так что в этом контроллере еще не так много controllers / welcome_controller.rb :

class WelcomeController < ApplicationController
  skip_authorize_resource only: :index
  authorize_resource class: false, only: [:dashboard]

  skip_before_action :authenticate_user!, only: [:index]
  layout 'external', only: [:index]

  def index; end

  def dashboard; end
end

Итак, у меня установлен CanCanCan и в моих моделях/ability.rb file:

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user (not logged in)
    if user.admin?
      can :manage, :all
      can :access, :rails_admin
    elsif user.manager?
      can :read, Lesson
      can :access, :dashboard
      can :modify, Company
    elsif user.user?
      can :read, Lesson
    else
      can :read, :root
    end
  end
end

Однако мой тест Rspec не проходит, и я не могу понять, почему.Код в spec / controllers / welcome_controller_spec.rb :

require 'rails_helper'
require 'cancan/matchers'

RSpec.describe WelcomeController, type: :controller do
  describe 'GET #index' do
    it 'returns http success' do
      get :index
      expect(response).to have_http_status(:success)
    end
  end

  describe 'GET #dashboard' do
    it 'manager routes to dashboard after login' do
      company = Company.create!(name: 'ACME', domain: 'acme.com')
      user = User.create!(email: 'test@test.com', password: 'password', password_confirmation: 'password', company_id: company.id, role: 1)
      sign_in user
      get :dashboard
      expect(response).to have_http_status(:success)
    end

    it 'user does not route to dashboard after login' do
      user = create(:user)
      sign_in user
      expect { get :dashboard }.to raise_error(CanCan::AccessDenied)
    end
  end
end

, что приводит к этой ошибке:

Failures:

  1) WelcomeController GET #dashboard manager routes to dashboard after login
     Failure/Error: get :dashboard

     CanCan::AccessDenied:
       You are not authorized to access this page.
     # ./spec/controllers/welcome_controller_spec.rb:17:in `block (3 levels) in <top (required)>'

Мне интересно, что только "Диспетчер маршрутов на приборную панель после входа в систему »Тест - это то, что не удается, так как 3-й тест для пользователя проходит без проблем, хотя я использую тот же самый вызов :dashboard.

Я был бы благодарен за любыеПомощь / предложения.

Спасибо!

1 Ответ

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

Насколько я понимаю, нет действия с именем alias_action : доступ , ссылка по этой ссылке (пожалуйста, исправьте меня, если это не правильно), но вы можете создать пользовательское действие с alias_action

ваша способность.рб

class Ability
  include CanCan::Ability

  def initialize(user)
    # here you create alias_action
    alias_action :create, :read, :update, :destroy, to: :access
    user ||= User.new # guest user (not logged in)
    if user.admin?
      can :manage, :all
      can :access, :rails_admin
    elsif user.manager?
      can :read, Lesson
      can :access, :dashboard
      can :modify, Company
    elsif user.user?
      can :read, Lesson
    else
      can :read, :root
    end
  end
end
...