Проблема в том, что не хватает 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 для выполнения такого простого отображения - или отображение можно инкапсулировать в отдельный метод, но это рассматривается в другом месте; -)