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

Ruby on rails 我应该将@notifications放在哪个控制器中?,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,想象一个典型的现代web应用程序——在导航栏或顶部运行的某个导航元素中有一个通知菜单,它告诉用户自上次访问以来收到了多少通知 它也可能有一个下拉菜单,他们可以清除现有的通知或只是查看它们 鉴于这些通知需要跨所有视图显示,我应该将其逻辑放在哪里?在我的应用程序控制器中?出于某种原因,这感觉是错误的——但我看不出任何其他解释 另外,我是否应该将实际部分放在generic/shared/文件夹中 对于那些拥有仪表板控制器(即非restful资源)的应用程序,它只是许多此类信息的中心集线器,最好的方法是

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

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

鉴于这些通知需要跨所有视图显示,我应该将其逻辑放在哪里?在我的
应用程序控制器中
?出于某种原因,这感觉是错误的——但我看不出任何其他解释

另外,我是否应该将实际部分放在generic
/shared/
文件夹中

对于那些拥有
仪表板
控制器(即非restful资源)的应用程序,它只是许多此类信息的中心集线器,最好的方法是什么?关于将包含在
仪表板中的结构化部分

编辑1

根据下面凯文和科林给出的答案,我需要再进一步

他们推荐Sandi Metz via解释的
立面
模式

然而,这是我的问题。在我的
application.html.erb
中,我有一个正在呈现的部分-
在该部分中,我希望能够调用某些东西(例如,
@通知
)。我如何访问该实例变量和其他共享变量/资源,这些变量将在此
facades/dashboard.rb中声明?

使用中所述的

请参阅:仅实例化控制器中的一个对象


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

记住以下几点很重要:

首先,只有在
应用程序控制器
是它唯一可以使用的地方时,才将此逻辑放入其中。由于此通知菜单很可能在整个应用程序中保持不变,因此它可能就属于此菜单

其次,您可以实现此外观,同时仍然保持
仪表板控制器
相当RESTful。控制器应该只负责实例化单个对象,对吗?因此,这样做是有意义的:

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 %>
app/controllers/dashboards\u controller.rb
类仪表板控制器<应用程序控制器
def秀
@dashboard=dashboard.new(当前用户)
结束
结束
app/facades/dashboard.rb
类仪表板
def初始化(用户)
@用户=用户
结束
def新_状态
@new|u status | |=status.new
结束
def状态
状态。用于(用户)
结束
def通知
@通知| |=用户通知
结束
私有的
属性读取器:用户
结束
app/views/dashboards/show.html.erb
仪表板模型为您提供了所需的所有相关信息,您的控制器将专注于单个实体。漂亮

更新

为了在任何分部中使用
@dashboard
实例变量,建议使用局部变量进行渲染,局部变量本质上是分部中使用的指定变量


关于如何开始向分部传递局部变量。

我的
/views/dashboard/index.html.erb
会是什么样子?我很喜欢你走的方向,但是我怎么/为什么要使用
@dashboard
对象呢?我也没有
仪表板
模型,它实际上只是一个控制器和一组视图,我用它来显示应用程序中所有其他资源的信息。或者更恰当地说,问题出在这里。在我的
application.html.erb
中,我有一个正在呈现的部分-
。在该部分中,我希望能够调用某些东西(例如,
@通知
)。我如何访问该实例变量和其他
共享变量/资源
,这些变量将在此
facades/dashboard.rb中声明。对。您可以创建一个仪表板模型,它是一个完全不需要数据库支持的PORO(普通的旧Ruby对象)。这是一个最佳实践,因为您不应该关心Rails控制器中的业务逻辑,它们最终应该只实例化一个实体。我已经更新了我的答案,以显示像
views/dashbard/show.html.erb
这样的东西的外观,以及如何在部分中使用它。我知道Collin,我正在努力解决的问题是如何将其从
仪表板
外观中抽象出来(即,在从应用程序布局调用的常规共享部分中,而不是在仪表板视图中)。这就是我在评论和更新的问题中试图得到的。你所做的只是从Thoughtbot文章中粘贴了更多的代码,这些代码并没有真正解决我的问题。如果我使用
仪表板控制器作为调用其中所有部分的基础,这将起作用。在我的情况下,我是从
ap调用它们application.html.erb
。我粘贴了Thoughtbot文章中的更多代码,因为我认为它准确地解决了您的问题。无论如何,如果您希望它在所述控制器中包含的部分中保持不变,为什么不从您的
应用程序控制器中调用新的
仪表板
模型呢?我非常喜欢这个方向你要走了。你对我对科林回答的评论有什么回答吗?