我应该将@notifications放在哪个控制器中?

时间:2015-06-23 23:50:00

标签: ruby-on-rails ruby-on-rails-4

想象一下一个典型的现代网络应用程序 - 在导航栏或沿顶部运行的某个导航元素中有一个notifications菜单,它告诉用户自上次访问以来他们收到了多少通知。

它也可能有一个下拉菜单,可以清除现有通知或只查看它们。

鉴于这些通知需要存在于所有视图中,我应该在哪里放置逻辑?在我的ApplicationController?由于某些原因,这感觉不对 - 但我看不到任何其他解释。

另外,我应该将实际的部分放在通用的/shared/文件夹中吗?

对于那些拥有Dashboard控制器(即非平静资源)的应用程序,它只是充当这些信息的中心枢纽,那么最好的方法是什么?在构造将包含在Dashboard

中的部分内容方面

修改1

根据Kevin和Collin给出的答案,我需要更进一步。

他们推荐Sandi Metz通过Thoughtbot here解释的Facade模式。

然而,这是我的问题。在我的application.html.erb中,我有一部分被渲染 - <%= render partial: "shared/navbar" %>.在那部分中,我希望能够调用某些东西(例如@notifications)。我如何访问将在此facades/dashboard.rb中声明的其他部分的实例变量和其他共享变量/资源?

2 个答案:

答案 0 :(得分:2)

使用Facade pattern中描述的this article

请参阅以下部分:仅在控制器中实例化一个对象

他们甚至在他们的示例中使用仪表板上的通知。 :)

答案 1 :(得分:1)

记住以下几点非常重要:

首先,只有将此逻辑放在var formatted = t.getFullYear() + '-' + (t.getMonth() < 9 ? '0' : '') + (t.getMonth() + 1) + (t.getDate() < 10 ? '0' : '') + '-' + (t.getDate()); 中,如果它是唯一可能去的地方。由于此通知菜单很可能在整个应用程序中保留,因此可能属于它。

其次,您可以在保持ApplicationController非常RESTful的同时实现此Facade。控制器应该只负责实例化单个对象,对吧?因此,做这样的事情是有道理的:

DashboardsController

仪表板模型为您提供所需的所有相关信息,您的控制器可以专注于单个实体。美丽!

<强>更新

为了在任何partials中使用你的app/controllers/dashboards_controller.rb class DashboardsController < ApplicationController def show @dashboard = Dashboard.new(current_user) end end app/facades/dashboard.rb class Dashboard def initialize(user) @user = user end def new_status @new_status ||= Status.new end def statuses Status.for(user) end def notifications @notifications ||= user.notifications end private attr_reader :user end app/views/dashboards/show.html.erb <%= render 'profile' %> <%= render 'groups', groups: @dashboard.group %> <%= render 'statuses/form', status: @dashboard.new_status %> <%= render 'statuses', statuses: @dashboard.statuses %> 实例变量,建议你使用local来渲染它,local本质上是一个在partial中使用的指定变量。

Here's a great link关于如何开始将本地人传递给部分人。