RoR记住部分渲染器中的状态

时间:2009-12-30 16:01:39

标签: ruby-on-rails renderpartial

我怎么能记住部分渲染器中的某个状态?

手头的问题:我的部分_testitem.html.erb呈现了一组testitems的表行。 Testitemidsortkey,部分用

调用
<%= render :partial => "testitem", :collection => @testbox.testitems.sort_by{|x| [x.sortkey, x.id]} %>

即。所有测试项目都按sortkey排序,然后按其ID排序。现在我想显示一个表格列,显示当前的排序键,我觉得它可以使用

<td rowspan="<%= Testitem.count_by_sql "SELECT count(*) from testitems where sortkey=#{testitem.sortkey}" %>"><%=h testitem.sortkey %></td>

当然会破坏表格,因为每个<td>得到的是行数。预期结果看起来有点像

Group   |   Id  |    Description |
----------------------------------
   1    |    1  |    ...         |
        --------------------------
        |    2  |    ...         |
        --------------------------
        |    16 |    ...         |
----------------------------------
   2    |    3  |    ...         |
----------------------------------
   3    |    4  |    ...         |
        |   10  |    ...         |
        |   11  |    ...         |
 ---------------------------------

有没有办法“记住”(在_testitem.html.erb内)我已经为给定的<td rowspan="">添加了sortkey这个事实?

感谢您帮助我。

3 个答案:

答案 0 :(得分:1)

在您的模型中,您可以执行以下操作:

class TestBox  
  named_scope :sorted_items, :sort_by => :sort_key, :id

  def grouped_items
    sorted_items.group_by(&:sort_key)
  end
end

在您看来,您可以这样做:

<% @test_box.grouped_items.each do |sort_key, items| %>
  <td rowspan="<% items.length %>"><%= render :partial => 'test_item', :collection => items %></td>
<% end %>

并在test_item partial:

<%= h item.sort_key %>

我不完全确定这会给你准确的目标,但它会为你提供一个良好的开端。

答案 1 :(得分:1)

首先,如果您仍然使用测试盒的所有测试项,则不需要额外的计数查询。

你想要做的是用组的td绘制第一个部分,然后定期绘制其余的项目..

在控制器中:

@testitems_by_keys = @testbox.testitems.group_by(&:sortkey)

在你看来:

<% @testitems_by_keys.each do |group, items| %>
  <%= render :partial => "item", :locals => { :object => items.shift, :group => group, :size => items.size+1 } %>
  <%= render items %>
<% end %>
_item中的

<tr>
<% if local_assigns[:group].present?  %>
  <td rowspan="<%= size %>"><%= group %></td>
<% end %>
rest of the partial....
</tr>

注意:只是在这里写了..可能包含也可能不包含语法错误。

答案 2 :(得分:0)

您可以尝试一种解决方案...首先,获取每个排序键所需的所有行扫描的哈希值。

@rowspans = TestItem.count(:group => sortkey)

然后,在部分中,当您渲染每一行时,设置一个实例变量以检查您是否使用当前排序键呈现行...

<% if testitem.sortkey != @current_sort_key %>
  <% @current_sort_key = testitem.sortkey %>
  <td rowspan="<%= @rowspans[@current_sort_key] -%>">
    <%= testitem.sortkey %>
  </td>
<% end %>
... render the rest of row ...

根据您对视图的干净程度,这可能更好地写在帮助程序内,而不是在视图本身中。