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

New*_*bie 2 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
Run Code Online (Sandbox Code Playgroud)

我的路线看起来像.

map.admin_panel '/admin-panel', :controller => 'admin', :action => 'admin_panel'
Run Code Online (Sandbox Code Playgroud)

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

<%= link_to "Admin Panel", :admin_panel unless is_admin? %>
Run Code Online (Sandbox Code Playgroud)

现在我收到一个错误:

undefined method `is_admin?'
Run Code Online (Sandbox Code Playgroud)

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

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

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
Run Code Online (Sandbox Code Playgroud)

users_controller.rb:

class UsersController < ApplicationController
      layout 'application'

      include AuthenticatedSystem

      helper_method :is_admin? #only added this line

      def new
      end
      ...
end
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

<div>
    <%= link_to "Admin Panel", :admin_panel unless current_user.is_admin? %>
</div>
Run Code Online (Sandbox Code Playgroud)

而已.有任何想法吗?

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

undefined method `is_admin?' for nil:NilClass
Run Code Online (Sandbox Code Playgroud)

我的会话创建(在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
Run Code Online (Sandbox Code Playgroud)

结束

ale*_*dev 11

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

helper_method :is_admin?
Run Code Online (Sandbox Code Playgroud)

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

所以,在你的用户模型中,

class User < ActiveRecord::Base

  def is_admin?
    self.user_role == 1
  end
end
Run Code Online (Sandbox Code Playgroud)

然后在视图中,

<%= link_to "Admin Panel", :admin_panel unless current_user.is_admin? %>
Run Code Online (Sandbox Code Playgroud)

哦,顺便说一句,确保您的用户不能通过大量属性分配任意改变他们的角色.并且最好为这些角色整数值定义常量.对不起,如果这太明显了:)