语法错误,意外' |'

时间:2014-08-29 02:27:26

标签: ruby-on-rails ruby

我在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 %>

2 个答案:

答案 0 :(得分:2)

您没有正确编写until循环;它没有yield任何元素,因此|x|不合适。

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

最后,您正在将数组([x])铲入数组lesson_num。您可能不希望这样做,因为您稍后迭代lesson_num并将每个元素用作Lesson表中的行的: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值或其他一些问题。

希望这有帮助!

<强>更新

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

由于你真正需要的是从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

答案 1 :(得分:0)

Ruby until语句不会将参数传递给块,因此第8行的|x|无效。

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