2017-04-13 65 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

问号缺少

相关问题