嗨,我对Rails真的很陌生,当然还有Haml,我已经尝试了几天了。
使用此部分渲染页面时出现错误:
app/views/todos/_form.html.haml:19: syntax error,unexpected keyword_end, expecting $end
(请原谅我的缩进错误,我没有选择复制和粘贴) _form.html.haml内容:
1 = form_tag :todo do |f|
2 %br
3 = f.label :done
4 = f.check_box :done
5 = f.label :title
6 = f.text_field :title
7 %br
8 = f.label :urgent
9 = f.check_box :urgent
10 %br
11 = f.label :important
12 = f.check_box :important
13 %br
14 = f.label :description
15 %br
16 = f.text_area :description
17 %br
18 = f.submit "Save"
19
答案 0 :(得分:3)
在HAML中,除=
之外,您不能拥有任何直接子元素,除非它是一个块。因为=
是ruby代码而不是html模板的一部分。
如果你想要=
的子元素需要传递给像= form_tag do |f|
那样的红宝石块。
因此导致此错误的是check_box。
在这个例子中,我会将表单助手移动到一行,如下所示:
= form_tag :todo do |f|
%br
= f.label :done, f.check_box(:done)
= f.label :title
= f.text_field :title
%br
= f.label :urgent, f.check_box(:urgent)
%br
= f.label :important, f.check_box(:important)
%br
= f.label :description
= f.text_area :description
%br
= f.submit "Save"
您还可以通过在方法调用结束时添加do
来告诉标签帮助程序接受块:
= form_tag :todo do |f|
%br
= f.label :done do
= f.check_box(:done)
...
甚至可以使用haml元素而不是rails form helper来制作标签:
= form_tag :todo do |f|
%br
%label{:for => 'done'}
= f.check_box :done
...
答案 1 :(得分:1)
您的缩进和嵌套不一致。我通常用2个空格。
尝试:
= form_tag :todo do |f|
%br
= f.label :done
= f.check_box :done
= f.label :title
= f.text_field :title
%br
= f.label :urgent
= f.check_box :urgent
%br
= f.label :important
= f.check_box :important
%br
= f.label :description
%br
= f.text_area :description
%br
= f.submit "Save"
这很好地转换为erb:
<%= form_tag :todo do |f| %>
<br>
<%= f.label :done %>
<%= f.check_box :done %>
<%= f.label :title %>
<%= f.text_field :title %>
</br>
<br>
<%= f.label :urgent %>
<%= f.check_box :urgent %>
</br>
<br>
<%= f.label :important %>
<%= f.check_box :important %>
</br>
<br>
<%= f.label :description %>
</br>
<% end %>