2010-08-24 57 views
1

我在我的application_controller中有標準的current_user方法。authlogic current_user是無

def current_user_session 
     return @current_user_session if defined? 
(@current_user_session) 
     @current_user_session = UserSession.find 
    end 

    def current_user 
     return @current_user if defined?(@current_user) 
     @current_user = current_user_session && 
current_user_session.record 
    end 

在我UserSessionController創建方法,我查 registration_complete? (簡單地檢查一列的值,其中 工作正常),然後如果 註冊未完成,則將用戶重定向到用戶編輯頁面。當我調試這個時,我可以看到已嘗試記錄@user_session對象存在,它指向 給正確的用戶,但 中的current_user方法的redirect_to edit_user_path(current_user), 始終返回nil。

這裏怎麼回事?

def create 
     @user_session = UserSession.new(params[:user_session]) 
     # uses a block to prevent double render error... 
     # because oauth and openid use redirects 
     @user_session.save do |result| 
      if result 
       flash[:notice] = "Login successful!" 
       if @user_session.new_registration? 
        logger.info "Session controller : new 
registration" 
        logger.info "Complete - 
#{@user_session.registration_complete?}" 
        flash[:notice] = "Please review profile" 
        redirect_to edit_user_path(current_user) 
       else 
        if @user_session.registration_complete? 
         logger.info "Session Controller - registration 
complete" 
        else 
         flash[:notice] = "Please complete profile" 
         logger.info "Session Controller - registration 
not complete" 
         redirect_to edit_user_path(current_user) 
#current_user nil here 
        end 
       end 
       redirect_to current_user ? profile_url(current_user) : 
login_url 
      else 
       if @user_session.errors.on(:user) 
        # if we set error on the base object, likely it's 
because we didn't find a user 
        render :action => :confirm 
       else 
        render :action => :new 
       end 
      end 
     end 
    end 
+0

如果你還是想回答這個問題...請參閱回答問題http://stackoverflow.com/q/5305306/1188763希望這有助於! – Norto23 2012-04-11 00:05:59

回答

1

我已經看到了這一點,並在我的一個應用程序中使用了相同的身份驗證系統。你沒有提到它,這就是爲什麼我向你提出這個建議,如果你有,那麼我需要看到更多的application_controller,所以無論如何嘗試在方法之前添加它。

helper_method :current_user 

我只是有一個尷尬的時刻,嘗試這樣做,而不是將塊傳遞給保存方法。

if @user_session.save 
    # rest of your logic here 
end 

「如果結果」可能無法達到您期望的效果。

否則檢查此@ user_session.record而不是current_user,如果它仍然爲nul您的問題不是current_user。

我需要回家,我會在今晚稍後回來。

+0

感謝您的回覆。這是我的appcontroller。我已經有了這個幫手方法。 http://pastie.org/1113118 – badnaam 2010-08-24 19:48:49

+0

好吧,看起來不錯,我可以告訴我,如果current_user在@ user_session.new_registration下?驗證是不是nul?我試圖找出任何錯誤,我不能,我在想@ user_session.registration_complete?可能會改變@user_session中的內容。否則將current_user存儲在另一個變量(如@user)中,然後在重定向中使用它來查看它是否有效。 – Hugo 2010-08-24 20:31:08

+0

其實是current_user在那個創建方法的任何地方工作? – Hugo 2010-08-24 20:33:28

0

嘗試使用這rails2:

class ApplicationController < ActionController::Base 
    helper :all # include all helpers, all the time 
    protect_from_forgery # See ActionController::RequestForgeryProtection for details 

    #Authlogic 
    filter_parameter_logging :password 

    helper_method :current_user 

    private 

    def current_user_session 
    return @current_user_session if defined?(@current_user_session) 
    @current_user_session = UserSession.find 
    end 

    def current_user 
    return @current_user if defined?(@current_user) 
    @current_user = current_user_session && current_user_session.record 
    end 
end 

,這對Rails3中:

class ApplicationController < ActionController::Base 
    helper :all # include all helpers, all the time 
    protect_from_forgery # See ActionController::RequestForgeryProtection for details 

    helper_method :current_user 

    private 

    def current_user_session 
    return @current_user_session if defined?(@current_user_session) 
    @current_user_session = UserSession.find 
    end 

    def current_user 
    return @current_user if defined?(@current_user) 
    @current_user = current_user_session && current_user_session.record 
    end 
end 

/config/application.rb

# Configure sensitive parameters which will be filtered from the log file. 
config.filter_parameters += [:password]