我有一个标准的User
模型,它有一个admin
布尔值。对于将该值设置为true的用户来说,一切都很好,但对于普通用户,我得到这个错误:
undefined local variable or method `current_user'
app/models/doc.rb:18:in `mine'
app/controllers/docs_controller.rb:9:in `index'
第18行Doc
模型如下所示:
def self.mine
where(:user_id => current_user.name, :retired => "active").order('created_at DESC')
end
我的User
模型是这样的:
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable
attr_accessor :current_password
attr_accessible :name, :password, :password_confirmation, :current_password, :email, :remember_me, :admin
end
class Ability
include CanCan::Ability
def initialize(user)
can :manage, :all if user.admin
end
end
在我的应用程序控制器中,我有以下内容:
class ApplicationController < ActionController::Base
protect_from_forgery
after_filter :user_activity
rescue_from CanCan::AccessDenied do |exception|
redirect_to root_path
end
def admin?
self.admin == true
end
def authenticate_admin
redirect_to :new_user_session_path unless current_user && current_user.admin?
end
private
def user_activity
current_user.try :touch
end
end
我认为这是所有相关的。
current_user
helper是一个不能从模型访问的控制器方法。你应该把当前用户作为参数从控制器传递给模型。
def self.mine(current_user)
where(:user_id => current_user.name, :retired => "active").order('created_at DESC')
end
编辑:边注
它看起来像user_id
是一个字符串在你的逻辑。如果这就是你正在做的,你应该重新考虑一下。使用数据库中的标识符在rails中设置belongs_to和has_many要容易得多。使用字符串id是非常规的,它是一个兔子洞,在非常糟糕的地方结束。