想象一下一个典型的现代网络应用程序 - 在导航栏或沿顶部运行的某个导航元素中有一个notifications
菜单,它告诉用户自上次访问以来他们收到了多少通知。
它也可能有一个下拉菜单,可以清除现有通知或只查看它们。
鉴于这些通知需要存在于所有视图中,我应该在哪里放置逻辑?在我的ApplicationController
?由于某些原因,这感觉不对 - 但我看不到任何其他解释。
另外,我应该将实际的部分放在通用的/shared/
文件夹中吗?
对于那些拥有Dashboard
控制器(即非平静资源)的应用程序,它只是充当这些信息的中心枢纽,那么最好的方法是什么?在构造将包含在Dashboard
。
修改1
根据Kevin和Collin给出的答案,我需要更进一步。
他们推荐Sandi Metz通过Thoughtbot here解释的Facade
模式。
然而,这是我的问题。在我的application.html.erb
中,我有一部分被渲染 - <%= render partial: "shared/navbar" %>.
在那部分中,我希望能够调用某些东西(例如@notifications
)。我如何访问将在此facades/dashboard.rb
中声明的其他部分的实例变量和其他共享变量/资源?
答案 0 :(得分:2)
答案 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关于如何开始将本地人传递给部分人。