语法错误:使用if / else if时意外的$ end?

时间:2011-08-17 23:38:44

标签: ruby-on-rails ruby syntax

我从我的某个控制器类中收到错误,我无法弄清楚原因。错误是:

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>

这可能是我失踪的小事 - 谢谢你的帮助!

3 个答案:

答案 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作为语法的一部分,上面谈到的规则不适用。

此外,ifcase在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