2017-04-13 66 views
-1

我有一個值,我在導航欄中使用。把它看作是某種低技能的通知。在根頁面我可以訪問它,因爲我把它定義這個方法裏面:Rails導航欄應用程序控制器變量

@conversations = Conversation.where("sender_id = ? OR recipient_id = ?",current_user.id,current_user.id) 

如果我移動到不同的方法(頁),該變量的範圍會了,我不得不重新定義它再次。

如何將此變量定義爲交叉控制器變量,因爲每個頁面都具有相同的導航欄?

<li> Conversations <%= @conversations.count %> </li> 
+0

將其定義在'application_controller.rb' – Pavan

+0

我試過,但我沒有訪問'current_user'的設計 –

回答

0

只有當用戶的loggedIn

<ul> 
    <li> About </li> 
    <% if current_user.present %> 
    <li>Conversations <%= @conversations.count %></li> 
    <% end %> 
</ul> 

導航欄顯示計數不管用戶登錄的ApplicationController

.... 
before_action: :conversation_count 

def conversation_count 
    @conversations = 
     Conversation.where("sender_id = ? OR recipient_id = ?",current_user.id,current_user.id) if current_user.present? 
end 
... 

導航欄顯示計數或沒有

<ul> 
    <li> About </li> 
    <li>Conversations <%= @conversations.try(:count).to_i %></li> 
</ul> 
+0

謝謝。我沒有用方法..。它正在工作。用'before_action'替換'before_action:',否則會崩潰。 –

+0

你是認真的嗎?你用你的方式批評建議你使用應用程序控制器,然後接受這個答案?大聲笑 – Mark

+0

@Mark ???你沒有任何幫助。你的回答沒有任何幫助。下次發表評論,請不要回答。你可以從他的回答中看到一個人的樣子。我正在使用應用程序控制器,但方式不對。 –

-1

正如別人所說,current_user在應用程序控制器中工作。

如果複製和粘貼您從您的談話控制器應用程序控制器有任何代碼,(除非你指定,否則所有的)​​你必須從每一個控制器不是從應用控制器繼承訪問它。

+0

您剛剛在評論中提供了Pavan的建議。正如我所說,我得到一個錯誤,說'current_user'沒有定義。 –

+1

這是因爲帕文所說的事實上是正確的。如果這是你的問題,我想強調繼承問題。你能發佈你在你的應用程序控制器中輸入的確切代碼,以及你收到的錯誤消息嗎? – Mark

0

您需要通過調用yield塊將navbar放置在layouts/application.html.erb和其餘內容中,以便實際上不會更改基於控制器的導航欄(它是固定的)。

同時在application_controller的方法中分配變量,以便在整個其他控制器中訪問它。

如果CURRENT_USER是不是從application_controller訪問可能是你不得不重新啓動服務器(但通常可被訪問)。

使用

如果current_user.present?

,而不是

如果current_user.present

問號缺少

相關問題