is_admin?在轨道中的功能? - 未定义的方法错误

时间:2010-05-04 08:58:25

标签: ruby-on-rails

目前,我正在为我的网站创建某种管理面板/后端。 我想做以下事情: 只有管​​理员(用户具有user_role(整数) - > 1 = admin,2 =主持人,3 =用户)才能查看和访问管理面板的链接。 所以我创建了一个admin_controller。在我的管理员控制器中,我创建了一个名为is_admin的新函数?:

class AdminController < ApplicationController

  def admin_panel
  end

  def is_admin?
    current_user.user_role == 1
  end

end

我的路线看起来像。

map.admin_panel '/admin-panel', :controller => 'admin', :action => 'admin_panel'

和我的_sidebar.html.erb(部分在applicaton.html.erb中)我创建了链接:

<%= link_to "Admin Panel", :admin_panel unless is_admin? %>

现在我收到一个名为:

的错误
undefined method `is_admin?'

问题出在哪里?请帮我解决这个问题!

好的,对不起,但它仍然无法正常工作。这是我的控制器:

application_controller.rb:

class ApplicationController < ActionController::Base
      include AuthenticatedSystem
      helper :all
      protect_from_forgery

      helper_method :current_user

        def current_user
          @current_user ||= User.find_by_id(session[:user])
        end
end

users_controller.rb:

class UsersController < ApplicationController
      layout 'application'

      include AuthenticatedSystem

      helper_method :is_admin? #only added this line

      def new
      end
      ...
end

user.rb

 require 'digest/sha1'
    class User < ActiveRecord::Base
        # Virtual attribute for the unencrypted password
        attr_accessor :password
        ... #more stuff but nothing for is_admin?

      def active?
        # the existence of an activation code means they have not activated yet
        activation_code.nil?
      end

      #here is my is_admin? code
      def is_admin?
        self.user_role == 1
      end
      ...
   end

现在我的观点(_sidebar.html.erb):

<div>
    <%= link_to "Admin Panel", :admin_panel unless current_user.is_admin? %>
</div>

就是这样。有什么想法吗?

顺便说一下:现在错误发生了一些变化。现在是:

undefined method `is_admin?' for nil:NilClass

我的会话创建(在sessions_controller.rb中):

  def create
self.current_user = User.authenticate(params[:login], params[:password])
if logged_in?
  if params[:remember_me] == "1"
    current_user.remember_me unless current_user.remember_token?
    cookies[:auth_token] = { :value => self.current_user.remember_token , :expires => self.current_user.remember_token_expires_at }
  end
  redirect_back_or_default('/')
  flash[:notice] = "Logged in successfully"
else
  render :action => 'new'
end

2 个答案:

答案 0 :(得分:11)

问题是您的控制器中定义的方法在您的视图中不可用,除非您在控制器中执行此操作:

helper_method :is_admin?

但是,在您的情况下,我建议您将此方法移动到用户模型中,因为它似乎或多或少是应用程序业务逻辑的一部分。

因此,在您的用户模型中,

class User < ActiveRecord::Base

  def is_admin?
    self.user_role == 1
  end
end

然后在视图中,

<%= link_to "Admin Panel", :admin_panel unless current_user.is_admin? %>

哦,顺便说一句,请确保您的用户无法通过批量属性分配任意更改其角色。并且最好为这些角色整数值定义常量。对不起,如果这太明显了:)

答案 1 :(得分:2)

如果您想在视图中使用控制器的方法,请使用helper_method

class AdminController < ApplicationController

  helper_method :is_admin?  #you should include this line so that you can access it in your view.

  def admin_panel
  end

  def is_admin?
    current_user.user_role == 1
  end

end