所以我有以下haml代码:
.row
.col-sm-12
%h2
= @title
%h3 This Week
%table
%tr
%td
%strong Date
%td
%strong
= @available__or_tutor
- 7.times do |i|
%tr
%td{:rowspan => 3}
= @date = @date + 1.days
- @available_times.each do |available_time, index|
- if i == available_time.day
- if index == 0
%td
= @tutor_var
%img{:src => "/assets/tick.png", :style => "width: 30%;"}
- else
%tr
%td
%tr
%td
我想要最后的
%tr
%td
%tr
%rd
嵌套在else语句中。具体来说,它们应该与tr
正好位于7.times do |i|
之下,因为haml强制缩进的方式我似乎无法做到这一点。我想知道HAML是否有某种覆盖以允许某种向后缩进。如果这是有道理的。
不太理想的解决方案当然是在html / erb中添加一个部分,然后只为该位转储haml。
答案 0 :(得分:0)
通常,如果你想做的事情在HAML中无法做到,那只是意味着你需要考虑另一种方法。我会尝试解释你的问题,你可以告诉我,如果我离你很远。
您希望从0迭代到6。
您希望根据@date
为每一天制作一组行。首先输出包含日期的标题行。
然后您想在@available_times
找到当天的条目。请注意,我看到的第一个问题 - 此逻辑与上面的%tr
缩进的级别相同,因此作为此逻辑的结果输出的任何%td
元素都不会包围%tr
。 我假设您打算在%tr
周围输出%td
。
根据您的问题判断,下一部分是混乱开始的地方。如果在@available_times中找不到合适的条目,我认为要输出两个空白行。但是没有办法突然退出层次结构。
所以这是我的建议。如果你在@available_times中有条目,你需要首先决定,并在正确的点分支,例如
- 7.times do |i|
%tr
%td{rowspan: 3}= @date = @date + 1.days
- if @available_times.each_with_index.any? { |available_time, index | i == available_time.day && index == 0 }
%tr
%td
= @tutor_var
%img{src: "/assets/tick.png", style: "width: 30%;"}
- else
%tr
%td
%tr
%td
也许我猜得太远了,你真的不希望%tr
内有if
,你希望教师单元出现在与{%td{rowspan: 3}
相同的行中1}}包含日期。如果是这种情况,您可以将评估提高一级,例如
- 7.times do |i|
- if @available_times.each_with_index.any? { |available_time, index | i == available_time.day && index == 0 }
%tr
%td{rowspan: 3}= @date = @date + 1.days
%td
= @tutor_var
%img{src: "/assets/tick.png", style: "width: 30%;"}
- else
%tr
%td
%tr
%td
请注意,可以缩短目前的评估。当你总是检查index == 0
时,你可以每次检查列表中的第一个条目(这是你的意思吗?除了第一个条目之外,@available_times列表中的任何条目都不会传递逻辑。 )
if @available_times.first.day == i
另一个注意事项:你也可以这样做:
- else
%tr
%td
%tr
%td
进入这个:
- else
- 2.times do
%tr
%td
(编辑:我注意到你使用四个空格进行缩进,我转而使用相同的。如果我使用两个空格,我通常会发现我犯的错误就更少了。)