我正在尝试创建一个帮助方法来检查登录用户是否有权使用某些功能,例如new
,create
,edit
,update
,和destroy
。
当它进入视图时,这是有效的,但我想阻止聪明的用户只需输入正确的URL就可以创建新的Games
。
在我的控制器中我有:
before_action :is_admin, only: [:index, :platform, :publisher, :new, :edit, :create, :update, :destroy]
def destroy
if !@admin
@game.destroy
respond_to do |format|
format.html { redirect_to games_url }
format.json { head :no_content }
end
else
redirect_to @game, notice: 'User not authorized to delete games.'
end
end
def is_admin
@admin = current_user.roles.detect {|r| r.name == "Super Admin" || r.name == "Game Admin"}
end
通过使用调试器,我可以看到实际调用了私有方法,但在公共方法中@admin
为空...
我怀疑这是因为实例变量是在私有空间中声明的,但如果它可用于视图,为什么它不可用于控制器...
无论如何,任何人都有任何建议或正确的方式来做我想做的事情,我将不胜感激。
谢谢。
答案 0 :(得分:0)
缓存@admin
没有意义,因为current_user
已被缓存。或者,如果没有缓存current_user,则也不需要缓存管理员。
根据当前代码,检查角色的更简单方法是设置模型级别
class User < ActiveRecord::Base
def admin?
role.match /admin/i
end
end
然后在控制器中
def destroy
if current_user.admin?
# other code
end
# other code
end
答案 1 :(得分:0)
好的,我想出了一个更好的方法,它现在正在运作。所以对于所有那些从谷歌这里磕磕绊绊的人来说,这就是我所做的......
在我的ApplicationController中,我创建了一些新的辅助方法:
class ApplicationController < ActionController::Base
helper_method :current_user
helper_method :is_super_admin
helper_method :is_game_admin
private
def current_user
@current_user ||= Member.find(session[:member_id]) if session[:member_id]
end
def is_super_admin
unless current_user.nil?
current_user.roles.detect {|r| r.name == "Super Admin"} unless current_user.roles.nil?
end
end
def is_game_admin
unless current_user.nil?
current_user.roles.detect {|r| r.name == "Game Admin"} unless current_user.roles.nil?
end
end
end
然后在控制器中我想限制访问,我创建了一个before_action
来获取这些值,然后显示操作,或者让用户回到索引操作...
class GamesController < ApplicationController
before_action :is_admin, only: [:new, :edit, :create, :update, :destroy]
#... controller methods
private
def is_admin
unless is_super_admin || is_game_admin
redirect_to games_url, notice: 'User is not authorized to perform this function.'
end
end
end