2011-08-17 107 views
5

我從我的一個控制器類中得到一個錯誤,我找不到原因。錯誤是:

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

這裏是terms_controller.rb:

​​

我的節目頁面目前只包括:

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

這可能是一些小的是我只是失蹤 - 謝謝你的幫助!

回答

10

,有沒有足夠的end關鍵字,它發現$end(令牌表示文件的年底),才能夠找到它一直在尋找這個問題 - 另一個end。 (用於end關鍵字解析器令牌可以是「keyword_end」或「DMOZ目錄」,這取決於紅寶石版本。)

每個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只是表達的紅寶石,所以它可能是更地道寫成這樣

@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。另一個選擇是使用哈希執行這種簡單的映射 - 或映射可以封裝在一個單獨的方法 - 但這是其他地方覆蓋;-)

1

而不是else if使用elsif

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 
+0

在看你的原代碼,你實際上是在使用術語ID來獲得本賽季。最好重寫Term類中的title屬性訪問器以返回正確的String。可以使用哈希和查找,因爲我在模型中的控制器中具有此處。 –