我从我的某个控制器类中收到错误,我无法弄清楚原因。错误是:
SyntaxError in TermsController#show, syntax error, unexpected $end, expecting keyword_end
这是terms_controller.rb:
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>
这可能是我失踪的小事 - 谢谢你的帮助!
答案 0 :(得分:10)
没有足够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 :(得分:1)
而不是else if
使用elsif
。
答案 2 :(得分:1)
为什么不这样做:
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