我有一个获取并设置current_user的受保护函数。
class ApplicationController < ActionController::Base
protected
def current_user
@current_user ||= User.find_by_id(session[:user_id])
end
def current_user=(user)
@current_user = user
session[:user_id] = user.nil? ? user : user.id
end
end
但是,当我登录时,不会调用current_user =方法。
class UsersController < ApplicationController
def sign_in
if (@mailbox = Mailbox.find_by(email: params[:email], password: params[:password]))
current_user= @mailbox.user
redirect_to mailboxes_path
else
redirect_to :root
end
end
end
此外,current_user的值在其他类中为nil。 如何确保调用ApplicationController中定义的方法?
答案 0 :(得分:2)
你没有通过
调用你的方法current_user = @mailbox.user
相反,您正在设置一个名为current_user的局部变量。如果你想调用你的控制器方法,你需要说:
self.current_user = @mailbox.user
答案 1 :(得分:2)
current_user
方法是实例方法,而不是类方法。因此,要访问它,您需要在控制器的实例上调用该方法,即self
:
self.current_user = @mailbox.user
有关进一步说明,请比较以下内容:
# This is a class method
def self.foo
return 'bar'
end
# This is an instance method
def foo
return 'bar'
end
前一种方法在类上,而后一种方法在类的实例上。因此,它们分别以下列方式调用:
# Invoking the class method
foo
#=> bar
# Invoking the instance method
self.foo
#=> bar
答案 2 :(得分:1)