gpt4 book ai didi

ruby-on-rails - Rails 3 - HAML block 传递给在原始上下文中呈现的部分而不是部分

转载 作者:太空宇宙 更新时间:2023-11-03 16:56:21 26 4
gpt4 key购买 nike

我有一个部分呈现了我想在不同页面上重复使用的表格。一些使用它的 View 需要插入额外的列,因此我创建了用于添加和检索新列标题的辅助方法,以及用于根据当前行的数据生成 的代码。

助手看起来像这样:

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

部分使用助手在呈现表格之前指定列详细信息:

- 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)

这很好用。然后我有一个 View 在呈现部分之前添加一列:

- table_column "tasks", "ID" do |task|
%td=task.id

= render "table"

部分的task 变量在呈现 ID 列时被使用,但出于某种原因,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 的 block 的原始上下文,但只有在从部分外部传递时才会这样。作为测试,我将 ID 列代码移到了部分代码中,在这种情况下它可以工作。我也尝试过,将字符串而不是 block 传递给 table_column(有效),但我真的更喜欢传递一个 HAML block ,因为我最终需要使用的代码会更多复杂的。任何见解将不胜感激。

最佳答案

HAML 立即呈现对 table_column 的调用,而不是简单地将 block 添加到 @@tables。我相信这样做是因为当您从局部调用 block 时,它是在您定义 block 的 View 上下文中呈现的,而不是局部本身。更好的方法可能是根据您传递给它的本地人有条件地拥有部分添加列:

- if defined?(id) && id
- table_column "tasks", "ID" do |task|
%td=task.id

- 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)

在这种情况下,仅当将名为 id 的本地名称传递到部分并将其设置为 true 时,才会呈现 ID 列,并且将始终呈现 Name、Start 和 End 列。然后你会像这样调用部分:

render "table" # Only renders the Name, Start & End columns

render "table", :id => true # Renders the ID, Name, Start, & End columns

关于ruby-on-rails - Rails 3 - HAML block 传递给在原始上下文中呈现的部分而不是部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8492349/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com