目前,我正在为我的网站创建某种管理面板/后端。 我想做以下事情: 只有管理员(用户具有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
端
答案 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