/ Illegal嵌套中的Haml :: SyntaxError:内容不能与%li在同一行上给出并嵌套在其中

时间:2014-02-12 23:35:37

标签: sinatra haml

我正在使用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在同一行上给出并嵌套在其中。

对此有任何帮助都很棒。

伊沃

1 个答案:

答案 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!