Rails在操作之前包括管理员访问权限

时间:2017-02-19 14:37:20

标签: ruby-on-rails methods

我想知道是否有人可以提供帮助。我有一个应用程序的当前设置,只有一个管理员用户应该能够看到用户索引:这很好。此非管理员用户也被重定向到root这也很好(虽然我想将它们重定向到他们的用户配置文件)

真正的问题是,我希望管理员用户能够从索引页面链接访问任何用户的用户个人资料页面,但此刻他只能访问自己的页面。我看到这是因为行动前的correct_user列出了" Syntastic settings set statusline+=%#warningmsg# set statusline+=%{SyntasticStatuslineFlag()} set statusline+=%* let g:syntastic_always_populate_loc_list = 1 let g:syntastic_auto_loc_list = 1 let g:syntastic_check_on_open = 1 let g:syntastic_enable_signs = 1 let g:syntastic_check_on_wq = 0

我尝试在行动之前向':admin_user'添加:show动作,但似乎没有帮助。任何关于如何解决这个问题的建议将不胜感激。

非常感谢

users_controller.rb

:show

define correct_user

class UsersController < ApplicationController
    before_action :logged_in_user, only: [:edit, :update, :show]
    before_action :correct_user, only: [:edit, :update, :show]
    before_action :admin_user, only: [:index]

定义admin_user

def correct_user
  @user = User.find(params[:id])
  redirect_to(root_url) unless current_user?(@user)
end

SESSIONS- sessions_helper.rb

定义current_user

 def admin_user
  if current_user.admin?
   flash.now[:success] = "Admin Access Granted"
  else
   redirect_to root_path
  end
 end

2 个答案:

答案 0 :(得分:1)

你差不多完成了!只需将其添加到correct_user

即可
def correct_user
  @user = User.find(params[:id])
  redirect_to(root_url) unless current_user?(@user) || current_user.admin?
end

您的代码当前重定向到root,除非当前用户是请求用户资源的用户,只需使用unless扩展User#admin?语句

此外,要重定向到用户自己的个人资料,请将correct_user的重定向声明更改为:

def correct_user
  @user = User.find(params[:id])
  redirect_to user_path(@user) unless current_user?(@user) || current_user.admin?
end

答案 1 :(得分:-1)

如果用户是管理员,最简单的事情就是放在逻辑异常中。我已经对您的路线进行了有根据的猜测并重定向到当前用户个人资料页面而不是root。

def correct_user
  @user = User.find(params[:id])
  redirect_to(user_path(current_user)) unless (current_user?(@user) && current_user.admin?)
end