2014-08-29 214 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|