2014-08-29 169 views
-1

我不断收到我的Rails 4 Ruby 2应用程序中的语法错误,但我不明白为什么。我认为这是发生在10行语法错误,意外的'|'

<% ('A'..'Z').each do |i| %> 
      <h2><%= i.capitalize %></h2> 
      <hr class="half-rule"> 

      <% lesson_num = [] %> 
      <% start_id = 0 %> 
      <% last_id = current_user.last_lesson %> 
      <% until start_id >= last_id do |x| %> 
        <% lesson_num << [x]%> 
        <% x += 1 %> 
      <% end %> 

      <% lesson_num.each do |id| %> 
        <% lesson = Lesson.find(id) %> 
        <% tags = @lesson.tags.split(',') %> 

        <% tags.each_with_index do |tag, index| %> 
         <% letter = tag.initial %> 
         <% if letter == i %> 
          <a href="/lesson/<%= id %>/step/1"><%= tag %></a> 
         <% else %> 
         <!-- else is only necessary if you actually need to put something here.--> 
         <% end %> 

        <% end %> 
      <% end %> 
     <% end %> 
+0

Ruby中'until'-loop的语法是什么?那个循环里面的内容会改变什么会改变循环条件的真实性? – 2014-08-29 02:42:59

回答

2

您没有正确编写until循环;它没有yield任何元素,所以|x|在这里不合适。

此外,您可能的意思是增加start_id,否则您的环路条件将永远不会评估为true

最后,您正在将阵列([x])铲入阵列lesson_num。您可能不希望这样做,因为稍后迭代lesson_num并将每个元素用作课程表中的行的:id

试着这么做:

 <% lesson_num = [] %> 
     <% start_id = 0 %> 
     <% last_id = current_user.last_lesson %> 
     <% until start_id >= last_id do %> 
       <% start_id += 1 %> 
       <% lesson_num << start_id %> 
     <% end %> 

我写了这个让start_id将首先增加,然后被添加到lesson_num。这样零不会在数组中结束,你不会稍后尝试查找Lesson.find(0),这会给你至少一个nil价值或一些其他问题。

希望这会有所帮助!

UPDATE

乍一看,我直接攻击了你的问题。但在查看了Jay Mitchell的建议并反思了一点之后,这里似乎有一个更简洁的解决方案,可以消除视图中的大量逻辑(Yay!),并且更具可读性。 (Yay!)

由于您真正需要的是从1(或者0)到current_user.last_lesson,因此您可以使用范围(1..current_user.last_lesson)来创建所需的数组。然后,您可以在您的视图遍历这个:

<% (1..current_user.last_lesson).each do |id| %> 
    <% lesson = Lesson.find(id) %> 

您可以进一步受益什么是设置你的模型之间的关系,因为它似乎是每个用户都有许多教训和每节课属于用户。这将为您提供更简单,更高效的方式来访问用户课程并对其进行迭代。 (即类似users.lessons.each do |lesson| ... end

+0

简化是巨大的!非常感谢。它的工作完美,我可能会尝试着解决像以后推荐的那样设置关联。 – user1573016 2014-08-29 03:31:21

0

红宝石until陈述并不参数传递到块,所以在第8行的|x|是无效的。

一种选择是将until替换为(0..current_user.last_lession).each do |x|