【发布时间】:2012-01-19 12:16:28
【问题描述】:
我有一个部分呈现我想在不同页面上重复使用的表格。一些使用它的视图需要插入额外的列,因此我创建了用于添加和检索新列标题的辅助方法以及用于根据当前行的数据生成
助手看起来像这样:
def table_column table_name, column_name, &block
raise "block required" unless block_given?
@@tables ||= {}
table = @@tables[table_name]
if table.nil?
@@tables[table_name] = table = []
end
index = table.size
table[index] = [column_name, block]
end
def table_cells table_name
table = @@tables[table_name] || []
table.map { |column| column[0] }
end
def table_headers table_name
table = @@tables[table_name] || []
table.map { |column| column[1] }
end
partial 在渲染表格之前使用帮助器指定列详细信息:
- table_column "tasks", "Name" do |task|
%td= task.name
- table_column "tasks", "Start" do |task|
%td= task.start_time.strftime(time_format)
- table_column "tasks", "End" do |task|
%td= task.end_time.strftime(time_format)
%table
%thead
%tr
- table_headers("tasks").each do |header|
%th= header
%tbody
- @tasks.each do |task|
%tr
- table_cells("tasks").each do |cell|
- cell.call(task)
这很好用。然后我有一个视图,它在渲染部分之前添加一列:
- table_column "tasks", "ID" do |task|
%td=task.id
= render "table"
渲染 ID 列时会使用部分中的 task 变量,但由于某种原因,ID 单元格会在表格上方渲染!生成的 HTML 类似于:
<td>10001</td>
<td>10002</td>
<td>10003</td>
<table>
<thead>
<tr>
<th>ID</th>
<th>Name</th>
<th>Start</th>
<th>End</th>
</tr>
</thead>
<tbody>
<tr>
<td>Steal underpants</td>
<td>Feb.12, 2012</td>
<td>Jun.07, 2012</td>
</tr>
<tr>
<td>???</td>
<td>Jun.08, 2012</td>
<td>Nov.13, 2012</td>
</tr>
<tr>
<td>Profit!</td>
<td>Nov.14, 2012</td>
<td>Jan.23, 2013</td>
</tr>
</tbody>
</table>
就好像 HAML 渲染器正在记住传递给 table_column 的块的原始上下文,但仅当从部分外部传递时。作为测试,我将 ID 列代码移动到部分中,并且在这种情况下可以正常工作。我也尝试过,将字符串而不是块传递给 table_column (有效),但我真的更喜欢传递一个 HAML 块,因为我最终需要使用的代码会更多复杂的。任何见解将不胜感激。
【问题讨论】:
标签: ruby-on-rails ruby view haml partial