我遇到了一个非常简单的Rails问题。
我有一个博客控制器,它有以下几行:
skip_before_action :check_admin, only: [:index, :show], raise: false
...
private
...
def check_admin
redirect_to(root_path) unless current_user && current_user.admin?
end
我希望行为如下:
如果用户未登录或登录且其角色不是admin,并尝试访问其他操作而不是:index和:show,则应重定向到根路径。
但是现在,它显示了用户未登录时每个操作的用户登录页面,而它允许任何登录用户的每个操作,甚至不包括管理用户。
我正在使用Devise和CanCanCan。我的ability.rb
看起来像这样:
def initialize(user)
can :read, :all # allow everyone to read everything
if user && user.admin?
can :access, :rails_admin # only allow admin users to access Rails Admin
can :dashboard # allow access to dashboard
can :manage, :all
end
end
我在哪里失败?
编辑:我将控制器中的操作调用更改为:
before_action :check_admin, except: [:index, :show]
现在,对于已记录的用户显示了所需的行为,而对于未记录的用户,它仍然会重定向到包含索引和显示的每个操作的用户登录页面。
编辑2 :我在before_action :authenticate_user!
中有application_controller.rb
,而其他一些控制器设置为skip_before_action :authenticate_user!, :only => [:index]
。但在我看来,这不应该干扰博客控制器...
另外,我在config/initializers/rails_admin.rb
中有以下内容:
RailsAdmin.config do |config|
### Popular gems integration
## == Devise ==
config.authenticate_with do
warden.authenticate! scope: :user
end
config.current_user_method(&:current_user)
答案 0 :(得分:0)
问题是你有before_action:authenticate_user!在你的应用程序控制器如果你看到你的控制器定义,那么:
class BlogController< ApplicationController
'&LT;'运算符意味着BlogController继承自ApplicationController,因此所有控制器(具有skip_before_action的控制器除外)都需要进行身份验证。
你需要
Class BlogController < ApplicationController
skip_before_action :authenticate_user!, :only => [:index, :show]