簡體   English   中英

如何從其他控制器調用ApplicationController中的方法?

[英]How to call methods in ApplicationController from other controllers?

我有受保護的函數來獲取和設置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中定義的方法?

您不是通過執行來調用方法

current_user = @mailbox.user

相反,您正在設置一個名為current_user的局部變量。 如果要調用控制器方法,則需要說:

self.current_user = @mailbox.user

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

使用helper_method

helper_method :current_user, :current_user=

並從私人刪除current_user方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM