我正在使用sinatra并遵循本教程here,我尝试使用HAML重写此代码:
<form action="/task/create" method="POST">
<input type="text" name="name" id="name">
<input type="submit" value="Add Task!"/>
</form>
<h2>Tasks:</h2>
<% unless @tasks.empty? %>
<ul>
<% @tasks.each do |task| %>
<li <%= "class=\"completed\"" if task.completed_at %>>
<a href="/task/<%=task.id%>"><%= task.name %></a>
</li>
<% end %>
</ul>
<% else %>
<p>No Tasks!</p>
<% end %>
这是我的HAML代码:
%form{action: "/task/create", method: "POST"}
%input{type: "text", name: "name", id: "name"}
%input{type: "submit", value: "Add Task!"}
%h2 Tasks:
- unless @tasks.empty?
%ul
- @tasks.each do |task|
%li= "class=\"completed\"" if task.completed_at
%a{href: "/task/#{task.id}"}= task.name
- else
%p No Tasks!
当我尝试查看页面时出现以下错误:
Haml :: / Illegal嵌套中的SyntaxError:内容不能与%li在同一行上给出并嵌套在其中。
对此有任何帮助都很棒。
伊沃
答案 0 :(得分:1)
你有几个问题正在发生。首先,您的if task.completed_at
需要被提升,以便它包含li和anchor标记;如你所知,它只适用于李。
第二个问题是你没有正确宣布你的课程。在HAML中,元素类最好用点符号声明。
%li.your_class_name_here
或者,您可以像这样声明您的类。
%li{:class => "class_name_here"}
这些方法中的任何一个都会创建一个不包含内容的空元素,因此内容元素可以像尝试使用锚标记一样嵌套在其中。
只要您使用该等号,您就会声明该元素的内容,而HAML将不会处理同一元素上的嵌套内容;这基本上是你告诉它用这行做的事情
%li= "class=\"completed\""
基本上这是对HAML说,创建一个li元素并将class =“completed”指定为此元素的内容......
下面我提供了一个你要完成的工作示例。
%form{action: "/task/create", method: "POST"}
%input{type: "text", name: "name", id: "name"}
%input{type: "submit", value: "Add Task!"}
%h2 Tasks:
- unless @tasks.empty?
%ul
- @tasks.each do |task|
- if task.completed_at
%li.completed
%a{href: "/task/#{task.id}"}= task.name
- else
%p No Tasks!