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

ste*_*392 5 ruby syntax ruby-on-rails

我从我的一个控制器类中得到一个错误,我无法弄清楚为什么.错误是:

SyntaxError in TermsController#show, syntax error, unexpected $end, expecting keyword_end
Run Code Online (Sandbox Code Playgroud)

这是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 
Run Code Online (Sandbox Code Playgroud)

我的展示页面目前只包括:

<h1> <%= @title %> </h1>
Run Code Online (Sandbox Code Playgroud)

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

小智 10

问题是没有足够的end关键字并且在找到它正在寻找的内容之前找到它$end(代表文件末尾的标记) - 另一个end.(end关键字的解析器标记是"keyword_end"或"Kend",具体取决于ruby版本.)

每个表达式都需要匹配关键字. ifend

要解决这个问题,请使用elsif而不是else if.它是同一if构造的一部分,不需要匹配end(只if需要匹配end).

   if x == 1
     "1"
   elsif x == 2
     "2"
   else
     "else"        
   end
Run Code Online (Sandbox Code Playgroud)

另一个选项是case,如果所有分支都检查相同的条件操作数(x在这种情况下),它可以正常工作:

   case x
     when 1 then "1"
     when 2 then "2"
     else "else"
   end
Run Code Online (Sandbox Code Playgroud)

如果你希望使用else if(请记住,每if启动一个新的if条件结构),然后确保关闭每个块一个是if打开.我缩进了代码以更好地展示这一点.

   if x == 1
     "1"
   else
     if x == 2
       "2"
     else
       "else"
     end
   end
Run Code Online (Sandbox Code Playgroud)

快乐的编码.


对于迂腐:还有另一种形式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 
Run Code Online (Sandbox Code Playgroud)

if/elsif/end语法可以以同样的方式被使用,但使用case避免了反复提及@term.id.另一个选择是使用Hash来执行这种简单的映射 - 或者映射可以封装在一个单独的方法中 - 但是其他地方也包括在内;-)