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

时间:2011-12-24 17:04:11

标签: ruby-on-rails design-patterns sidebar

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

我应该如何去尊重Rails设计模式?我听说过Cells gem,但我不确定是否使用它。

3 个答案:

答案 0 :(得分:8)

这是一种方法,在你的布局中添加一个命名的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

答案 1 :(得分:5)

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

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

  1. 使用content_for(:sidebar)和yield(:sidebar)
  2. 使用部分方法
  3. 使用Cells gem
  4. <强> 1。使用content_for(:sidebar)yield(:sidebar)

    这适用于您访问的每个链接(每个控制器操作)呈现不同侧边栏的情况。在这种情况下,您访问的每个视图都将包含content_for(:sidebar)部分。

    如果侧边栏视图仅取决于会话中某个变量的状态,则不应为您访问的每个链接呈现侧边栏。 然后你应该使用像 turbolinks 这样的好的缓存系统,以避免渲染很多次相同的东西,或者使用类似 Cells gem 的东西和javascript来渲染主要部分布局。

    <强> 2。使用部分

    使用partials总是很好的消除重复。如果侧边栏非常简单并且针对每个控制器进行了更改,则可以将其渲染为部分控制器。但是如果你在同一个控制器中渲染不同的部分,根据某些状态,它可能表明你的视图中有业务逻辑,应该避免。

    第3。使用Cells gem

    每次必须从不同的控制器渲染侧边栏时,非常好的设计模式。

    视图中需要很多业务逻辑,这肯定是一种很好的做法。

    您可以在操作中调用视图。在该视图中,有一个声明render_cell(:sidebar, params)。此语句将执行一些业务逻辑并呈现侧栏的视图。 好像 第一个操作调用其他控制器操作来呈现视图的特定部分(称为单元格)

    如果您仅对侧边栏进行更改,则可能必须创建其他简单操作,以便javascript将请求它。此操作将再次调用render_cell(:sidebar)方法以响应视图。

    这是一种非常有趣的方法。

    其他想法:

    • 您的侧边栏只能使用相同的javascript进行渲染 行动。
    • 您的侧边栏可以由角度控制器渲染,并且rails会使用侧边栏对象发送jsons。 (寻找“单页应用”)

答案 2 :(得分:2)

尝试这样的事情

<div class="sidebar">
    <% if current_page?(controller => "friends", :action => "show") %>
        <h4>New Friends</h4>
    <% elseif current_page?(controller => "accounts", :action => "show") %>
        <h4>Recent Activities</h4>
    <% end %>
</div>

如果上面的代码适合你想要做的事情(看起来这就是你想要实现的),那么坚持下去,否则与一些宝石一起使用可能是有益的。另请查看helper页面,了解如何使用current_page?方法。希望它有所帮助