如何从其他控制器调用ApplicationController中的方法?

时间:2013-12-15 20:41:28

标签: ruby-on-rails ruby ruby-on-rails-4

我有一个获取并设置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中定义的方法?

3 个答案:

答案 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)

使用helper_method

helper_method :current_user, :current_user=

并从私有中移除current_user方法。