Я использую CanCanCan для авторизации. В принципе, я хочу, чтобы пользователи не регистрировались, пользователи могут получить доступ к Home#Index
, но они должны быть зарегистрированы для Home#Dashboard
.uninitialized constant Home - брошен CanCanCan для не-db поддерживаемого ресурса
У меня есть этот маршрут:
get 'dashboard', to: 'home#dashboard', as: :dashboard
Это мой HomeController
:
class HomeController < ApplicationController
authorize_resource except: [:index]
skip_authorization_check only: [:index]
layout 'marketing', only: [:index]
def index
end
def dashboard
end
end
Это мой application_controller.rb
:
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
before_action :configure_permitted_parameters, if: :devise_controller?
check_authorization :unless => :devise_controller?
rescue_from CanCan::AccessDenied do |exception|
respond_to do |format|
format.json { head :forbidden }
format.html { redirect_back(fallback_location: root_path, flash: { danger: exception.message }) }
end
end
protected
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:accept_invitation, keys: [:first_name, :last_name, :phone])
end
end
Однако, когда я иду в /dashboard
, это ошибка, которую я получаю:
NameError - uninitialized constant Home:
activesupport (5.0.0.1) lib/active_support/dependencies.rb:550:in `load_missing_constant'
activesupport (5.0.0.1) lib/active_support/dependencies.rb:203:in `const_missing'
activesupport (5.0.0.1) lib/active_support/inflector/methods.rb:268:in `block in constantize'
activesupport (5.0.0.1) lib/active_support/inflector/methods.rb:266:in `constantize'
activesupport (5.0.0.1) lib/active_support/core_ext/string/inflections.rb:66:in `constantize'
Что может быть причиной этого?
Edit 1
После некоторой отладки, я теперь понимаю, что это, кажется, связано с тем, что действия я являюсь authorizing
не поддерживается ресурсом ActiveRecord.
Другими словами, как только я добавить :dashboard
к exception
списку, например, так:
authorize_resource except: [:index, :dashboard]
skip_authorization_check only: [:index, :dashboard]
Он работает. Страница загружается как очарование.
Итак, я думаю, что реальная проблема заключается в том, как мне разрешить/заблокировать ресурс, который не является моделью ActiveRecord?
у вас есть опечатка в имени файла, который определяет 'HomeController'? , Вы перезапустили сервер?, Я просто догадываюсь, но это может быть что-то вроде этого. Думаю, это больше связано с опечаткой. – fanta
Я только что перезапустил сервер и по-прежнему ту же ошибку. Кроме того, t опечатка, потому что, когда я перехожу к 'home # index', это работает. Это мой' unauthenticated root_path', и это работает отлично. Это просто 'home # dashboard', это не так. Имеет ли значение, что' Home' не коррелирует с модель в моей БД? Будет ли CanCanCan иметь проблемы с «авторизацией ресурса», который не является ресурсом db? – marcamillion
Я думаю, что вы правильно, возможно, это связано с тем, что у вас нет модели для дома, посмотрите здесь https://github.com/CanCanCommunity/cancancan/wiki/Non-RESTful-Controllers, в которой рассказывается, как справляться с этими случаями. – fanta