2

我一直在關注在Rails 3.1中實現身份驗證的Railscast#270發現Rails Cast #270。我想要做的是在我的模板中有能力在用戶登錄時顯示不同的鏈接。它應該看起來像這樣。在Rails中登錄時顯示不同的文本

If user logged in 
    Display link to Profile 
    Display logout 
If user logged out 
Display link to register 
Display link to login 

我想我可以找出鏈接從theRailsTutorial不同的地方,但我卡在如何判斷用戶在簽署與否。

使用軌道教程中,我發現這個片段

<% if signed_in? %> 
    <li><%= link_to "Profile", current_user %> sfsdfsdf</li> 
<% end %> 

,當我把我的會議輔助下不工作:

def signed_in? 
     [email protected]_user.nil? 
end 

你將如何使這項工作?

回答

6

使用current_user

所以只是

<% if current_user %> 
    <li><%= link_to "Profile", current_user %> sfsdfsdf</li> 
<% end %> 

BTW在HAML這將是剛剛

-if current_user 
    %li= 
    link_to "Profile", current_user, sfsdfsdf 

(兩端得到暗示 - 既爲HTML <li>標籤(即</li>)和紅寶石if聲明!)
對於不使用HAML的人來說,這應該會讓你的食慾大增:)

CURRENT_USER本身使用@current_user連帶建立在你的應用程序控制器中:

helper_method :current_user 

    private 

    def current_user 
    @current_user ||= User.find(session[:user_id]) if session[:user_id] 
    end 
+0

@current_user和current_user是同一件事嗎?如果這是普通的ruby,他們不會,但Rails是否奇蹟般地做了一些事情,所以@ current_user在應用程序控制器中定義,然後通過current_user在視圖中訪問它?這是一個共同的軌道模式? –

+1

@NoahClark,'@ current_user'和'current_user'不是一回事。一個在實例變量中,另一個是一個方法。 「@ current_user」是在名爲'current_user'(位於application_controller.rb)中的方法中設置的。如果您將方法的名稱更改爲「def current_foo」,那麼您將使用它來檢查「@ current_user」。我們稱之爲方法'current_user'爲方便 – stephenmurdoch

+1

噢,好吧。這很有道理。謝謝。我仍然對這種方法的想法感到困惑,因爲這種方法最終沒有找到對方。我會明白的! –

1

聽起來好像需要來設置current_user方法。這裏是瑞安貝茨如何在railscast 270中執行它:

class ApplicationController < ActionController::Base 
    protect_from_forgery 

    private 

    def current_user 
    @current_user ||= User.find(session[:user_id]) if session[:user_id] 
    end 

    # don't forget this line too 
    helper_method :current_user 
end 

確保你已經在application_controller.rb中得到了這個。沒有必要再使用if signed_in,雖然如果你想繼續使用它,它仍然可以工作

+1

ps - 如果您要定義'signed_in'方法,那麼您幾乎肯定會考慮將它從sessions_helper(僅適用於會話視圖)轉移到application_controller.rb中,您可以使用它在全局範圍內使用它'helper_method:signed_in'的幫助 – stephenmurdoch

+0

我的應用程序控制器看起來完全像你的。 –