Ada*_*NYC 4 design-patterns ruby-on-rails sidebar
我想有一个右侧栏,每页都有内容更改.例如,当我在"朋友"页面中时,侧栏应显示"新朋友".当我在"帐户"页面时,侧栏应显示"近期活动".
我该怎么做才能尊重Rails设计模式?我听说过Cells gem,但我不确定我是否使用它.
这是一种方法,在你的布局中添加一个命名的yield部分
<div id="main-content">
    <%= yield %>
</div>
<div id="side-content">
    <%= yield(:side_bar) %>
</div>
然后在您的视图中使用content_for将内容放入指定的yield中
# friends view ....
<% content_for(:side_bar) do %>
    <%= render :partial => "shared/new_friends" %>
<% end %>
# account view ....
<% content_for(:side_bar) do %>
    <%= render :partial => "shared/recent_activity" %>
<% end %>    
这要求您明确每个视图的侧栏中显示的内容,也许它动态地执行它更好?可能取决于具体情况和您的偏好
另见 - http://guides.rubyonrails.org/layouts_and_rendering.html#understanding-yield
在我们的观点发生重大设计变更的那一刻,我接受了这个问题.在考虑了侧边栏问题之后,我意识到没有最好的解决方案(一如既往).每种情况都有更好的解决方案.
我将在这里比较3个解决方案:
1.使用content_for(:sidebar)和yield(:sidebar)
这适用于您访问的每个链接(每个控制器操作)呈现不同侧边栏的情况.在这种情况下,您访问的每个视图都将包含该content_for(:sidebar)部分.
例如,如果侧边栏视图仅取决于会话中某个变量的状态,则不应为您访问的每个链接呈现侧边栏.然后你应该使用像turbolinks这样的好的缓存系统,以避免渲染很多次相同的东西,或者使用带有javascript 的Cells gem这样的东西来仅渲染布局的主要部分.
2.使用部分
使用partials总是很好的消除重复.如果侧边栏非常简单并且针对每个控制器进行了更改,则可以将其渲染为部分控制器.但是如果你在同一个控制器中渲染不同的部分,根据某些状态,它可能表明你的视图中有业务逻辑,应该避免.
3.使用Cells gem
每次必须从不同的控制器渲染侧边栏时,非常好的设计模式.
它需要很多业务逻辑,这肯定是一种很好的做法.
在这里你有一个调用视图的动作.在这个视图中,有一个声明.此语句将执行一些业务逻辑并呈现侧栏的视图.这是因为,如果在第一个动作叫其他控制器动作来渲染视图的特定部分(称为小区)render_cell(:sidebar, params)
如果您仅对侧边栏进行更改,则可能必须创建其他简单操作,以便javascript请求它.此操作将render_cell(:sidebar)再次调用该方法以响应视图.
这是一个非常有趣的方法.
其他想法: