【发布时间】:2011-12-24 17:04:10
【问题描述】:
我想要一个右侧栏,其中包含每个页面的内容更改。 例如,当我在好友页面时,侧边栏应该显示新好友。 当我在“帐户”页面时,侧栏应显示“最近的活动”。
我应该怎样做才能尊重 Rails 设计模式?我听说过 Cells gem,但我不确定我是否使用它。
【问题讨论】:
标签: ruby-on-rails design-patterns sidebar
我想要一个右侧栏,其中包含每个页面的内容更改。 例如,当我在好友页面时,侧边栏应该显示新好友。 当我在“帐户”页面时,侧栏应显示“最近的活动”。
我应该怎样做才能尊重 Rails 设计模式?我听说过 Cells gem,但我不确定我是否使用它。
【问题讨论】:
标签: ruby-on-rails design-patterns sidebar
这是一种方法,在您的布局中添加一个命名的产量部分
<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 这样好的缓存系统,以避免多次渲染相同的东西,或者使用像 Cells gem 这样的东西和 javascript 来只渲染主要部分布局。
2。使用部分
使用分部总是有助于消除重复。如果您的侧边栏非常简单并且针对每个控制器进行了更改,您可以将其渲染为部分。但是如果你在同一个控制器中渲染不同的部分,根据某种状态,这可能表明你的视图中有业务逻辑,应该避免这种情况。
3.使用细胞宝石
当您每次都必须从与视图其余部分不同的控制器渲染侧边栏时,这是非常好的设计模式。
它需要很多业务逻辑,这确实是一个很好的做法。
这里有一个调用 view 的 action。在该视图中,有一个声明 render_cell(:sidebar, params)。该语句会做一些业务逻辑并渲染侧边栏的视图。 好像 第一个动作调用其他控制器动作来呈现视图的特定部分(称为单元格)
如果您只对侧边栏进行更改,您可能需要创建其他简单的操作,以便 javascript 请求它。此操作将再次调用render_cell(:sidebar) 方法以响应视图。
这是一种非常有趣的方法。
其他想法:
【讨论】:
试试这样的
<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>
如果上面的代码符合你想要做的事情(看起来这是你想要实现的),那么坚持下去,否则使用一些 gem 可能是有益的。还可以查看 helper 页面以了解如何使用 current_page?方法。希望对你有帮助
【讨论】: