2014-02-12 71 views
0

我正在使用sinatra并遵循本教程here,我尝试用HAML重写此代码:Haml :: SyntaxError在/非法嵌套:内容不能同时在%li和同一行中给出并嵌套在内

<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的::在SyntaxError错误/非法嵌套:含量可“T都与%li在同一行上,并嵌套在其中。

任何有助于此的将是伟大的。

Ivo

+0

可能重复的[Haml的::的SyntaxError - 非法嵌套:在同一行作为%的含量不能既给出并且嵌套在(http://stackoverflow.com/questions/10202931/ hamlsyntaxerror非法嵌套内容-着待既赋予-ON-THE-同林) – matt

回答

1

您有几个问题正在进行。首先你的if task.completed_at需要举起来,以便它包含李和锚标签;如你所拥有的,它只适用于李。

第二个问题是你没有正确地声明你的类。在HAML中,元素类应该像这样用点符号来声明。

%li.your_class_name_here

或者你可以宣布你的类像这样。

%li{:class => "class_name_here"}

这两种方法的创建不包含内容的空元素,然后根据这样的内容元素可以被嵌套在像你与你的锚标记尝试。

只要您使用该等号,您将声明该元素的内容,并且HAML将不会处理同一元素上的嵌套内容;这基本上是你告诉它做这一行

%li= "class=\"completed\""

本质上讲,这是说给HAML,创造的li元素,并指定类=“已完成”的该元素的含量......

下面我提供了一个你正在努力完成的工作例子。

%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!