Синтаксическая ошибка: неожиданный конец $ при использовании if / else if? - PullRequest
5 голосов
/ 18 августа 2011

Я получаю сообщение об ошибке от одного из моих классов контроллеров и не могу понять, почему. Ошибка:

SyntaxError in TermsController#show, syntax error, unexpected $end, expecting keyword_end

Вот так: термин_контроллер.рб:

class TermsController < ApplicationController

    def show
        @term = Term.find(params[:id])
        if @term.id == 1
            @title = "Fall"
        else if @term.id == 2
            @title = "Winter"
        else if @term.id == 3
            @title = "Spring"
        else if @term.id == 4
            @title = "Summer"
        end 
    end 
end 

Моя страница показов состоит из:

<h1> <%= @title %> </h1>

Это, наверное, что-то маленькое, что мне просто не хватает - спасибо за вашу помощь!

Ответы [ 3 ]

10 голосов
/ 18 августа 2011

Проблема в том, что не хватает end ключевых слов, и он нашел $end (маркер, представляющий конец файла ), прежде чем он смог найти то, что искал - еще один end.(Маркер синтаксического анализа для ключевого слова end имеет значение «keyword_end» или «Kend», в зависимости от версии ruby.)

Каждое if выражение требует соответствия end ключевое слово.

Чтобы обойти это, используйте elsif вместо else if.Он является частью той же конструкции if и не требует сопоставления end (только if требует сопоставления end).

   if x == 1
     "1"
   elsif x == 2
     "2"
   else
     "else"        
   end

Другой вариант - case, который хорошо работает, если все ветви проверяют один и тот же условный операнд (x в этом случае):

   case x
     when 1 then "1"
     when 2 then "2"
     else "else"
   end

Если вы делаете хотите использовать else if (помнитекаждый if запускает новую if условную конструкцию), затем убедитесь, что закрывает каждый блок , что if открывается.Я отступил в коде, чтобы лучше показать эту точку.

   if x == 1
     "1"
   else
     if x == 2
       "2"
     else
       "else"
     end
   end

Удачное кодирование.


Для педантиков: есть и другая форма if, которая равна expr if cond, который не имеет совпадения end как часть синтаксиса, и правила, о которых говорилось выше, к нему не относятся.

Кроме того, if и case являются простовыражения в Ruby, поэтому он может быть написан более идиоматически, например:

@term = Term.find(params[:id])
@title = case @term.id
   when 1 then "Fall"
   when 2 then "Winter"
   when 3 then "Spring"
   when 4 then "Summer"
   else "Invalid Term"
end 

Синтаксис if/elsif/end можно использовать таким же образом, но использование case позволяет избежать повторного упоминания @term.id.Другой вариант - использовать Hash для выполнения такого простого отображения - или отображение можно инкапсулировать в отдельный метод, но это рассматривается в другом месте; -)

1 голос
/ 18 августа 2011

Почему бы просто не сделать это:

class TermsController < ApplicationController

  @@seasons = { 1 => "Fall", 2 => "Winter", 3 => "Spring", 4 => "Summer"}

  def show
    @term = Term.find(params[:id])
    @title = @@seasons[params[:id]] || "Invalid Season"
  end

end
1 голос
/ 18 августа 2011

Вместо else if используйте elsif.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...