Rails中带有动态内容的侧栏设计模式

Ada*_*NYC 4 design-patterns ruby-on-rails sidebar

我想有一个右侧栏,每页都有内容更改.例如,当我在"朋友"页面中时,侧栏应显示"新朋友".当我在"帐户"页面时,侧栏应显示"近期活动".

我该怎么做才能尊重Rails设计模式?我听说过Cells gem,但我不确定我是否使用它.

hou*_*se9 8

这是一种方法,在你的布局中添加一个命名的yield部分

<div id="main-content">
    <%= yield %>
</div>
<div id="side-content">
    <%= yield(:side_bar) %>
</div>
Run Code Online (Sandbox Code Playgroud)

然后在您的视图中使用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 %>    
Run Code Online (Sandbox Code Playgroud)

这要求您明确每个视图的侧栏中显示的内容,也许它动态地执行它更好?可能取决于具体情况和您的偏好

另见 - http://guides.rubyonrails.org/layouts_and_rendering.html#understanding-yield


Mau*_*aes 5

在我们的观点发生重大设计变更的那一刻,我接受了这个问题.在考虑了侧边栏问题之后,我意识到没有最好的解决方案(一如既往).每种情况都有更好的解决方案.

我将在这里比较3个解决方案:

  1. 使用content_for(:sidebar)和yield(:sidebar)
  2. 使用部分方法
  3. 使用Cells gem

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)再次调用该方法以响应视图.

这是一个非常有趣的方法.


其他想法:

  • 您的侧边栏只能使用来自同一操作的javascript进行渲染.
  • 您的侧边栏可以由角度控制器渲染,并且rails会使用侧边栏对象发送jsons.(寻找"单页应用")