目前,我正在为我的网站创建某种管理面板/后端.我想执行以下操作:只有管理员(用户有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)
哦,顺便说一句,确保您的用户不能通过大量属性分配任意改变他们的角色.并且最好为这些角色整数值定义常量.对不起,如果这太明显了:)
| 归档时间: |
|
| 查看次数: |
5192 次 |
| 最近记录: |