0

我正在尝试创建一个辅助方法来检查登录用户是否被授权使用某些功能,如newcreateeditupdatedestroy

这在进入视图时有效,但我想阻止聪明的用户Games通过简单地输入正确的 url 来创建新的。

在我的控制器中,我有:

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中为空......

我怀疑这是因为实例变量是在私有空间中声明的,但是如果它对视图可用,为什么它对控制器不可用...

无论如何,任何人有任何建议,或正确的方法来做我想做的事情,将不胜感激。

谢谢你。

4

2 回答 2

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
于 2013-10-19T22:27:28.983 回答
0

没有必要缓存@admin,因为current_user已经缓存了。或者如果 current_user 没有缓存,也不需要缓存 admin。

根据目前的代码,一个更简单的检查角色的方法是设置它的模型级别

class User < ActiveRecord::Base
  def admin?
    role.match /admin/i
  end
end

然后在控制器中

def destroy
  if current_user.admin?
    # other code
  end
  # other code
end
于 2013-10-19T18:19:21.507 回答