2013-12-15 52 views
0

我有保護功能,獲取並設置current_user。如何從其他控制器調用ApplicationController中的方法?

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的值在其他類中爲零。 如何確保在ApplicationController中定義的方法被調用?

回答

1

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 
+0

啊我明白了。非常感謝你! – user1742188

+0

如果此答案有助於解決您的問題,請考慮將其接受爲正確的:http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – zeantsoi

1

你不這樣做

current_user = @mailbox.user 

相反,你叫設定CURRENT_USER一個局部變量調用你的方法。如果你想打電話給你的控制器的方法,你需要說:

self.current_user = @mailbox.user 
1

使用helper_method

helper_method :current_user, :current_user= 

,並從私人刪除current_user方法。

相關問題