私有方法中的实例变量在公共控制器方法中为零

时间:2013-10-19 17:56:57

标签: ruby-on-rails ruby-on-rails-4

我正在尝试创建一个帮助方法来检查登录用户是否有权使用某些功能,例如newcreateeditupdate,和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为空...

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

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

谢谢。

2 个答案:

答案 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