2015-08-24 83 views
0

有了這個代碼:語法錯誤具體參數順序

Sponsorship.includes(patient: :vaccinations, :backer) 

我得到syntax error, unexpected ')', expecting =>。但是當我改變參數的順序時,如下所示:

Sponsorship.includes(:backer, patient: :vaccinations) 

錯誤消失。爲什麼語法錯誤依賴於參數的順序?

+0

你的問題是什麼? – sawa

+0

他有一個語法錯誤,想知道爲什麼。 – Daiku

回答

1

你這裏有兩種有效的替代品:

@sponsorship = Sponsorship.includes({ patient: :vaccinations }, :backer) 
         .find_by_slug(params[:id]) 

@sponsorship = Sponsorship.includes(:backer, patient: :vaccinations) 
         .find_by_slug(params[:id]) 

第一次有兩個參數,第一個是一個哈希,第二個是一個值,

在第二個例子你仍然有2個參數,第一個是值,第二個是隱式哈希。在Ruby中,你可以省略括號當散列傳遞給方法

你在這裏做什麼的最後一個參數:

@sponsorship = Sponsorship.includes(patient: :vaccinations, :backer) 
         .find_by_slug(params[:id]) 

被解釋爲:

@sponsorship = Sponsorship.includes({ patient: :vaccinations, :backer }) 
         .find_by_slug(params[:id]) 

這顯然是錯誤的,因爲哈希需要一個{ key0: value0, keyN: valueN }語法。

+0

真棒解釋!謝謝。 –

-1

這不是有效的ruby語法。你大概的意思是:

@sponsorship = Sponsorship.includes(patient: [:vaccinations, :backer]).find_by_slug(params[:id])

注意patient:相同:patient =>,這是一個哈希的關鍵protion。所以紅寶石希望接下來的事情是哈希值的一半,而不是事物列表。我把它改成了一個數組(不知道這是你的意思)。

+0

不完全是我的意思。根據你的建議,你暗示贊助有一名患者,患者有很多接種疫苗,患者有一名支持者,情況並非如此。這真的是贊助有一個病人,病人有很多疫苗接種,贊助有一個支持者。 –

5

因爲如果依靠Ruby語法糖來避免自己編寫{},那麼散列參數需要是最後一個參數。

+0

如果我要保持參數的順序,我將如何修復導致錯誤的行?我認爲有人評論過這樣的解決方案,但刪除了它。 –

-1

includes方法期望找到散列作爲最後一個參數。你必須像這樣傳遞哈希。否則,你必須在散列周圍放置{}

+0

如果這是唯一的原因,它會引發參數錯誤,而不是語法錯誤。因此你的解釋是無關緊要的。 – sawa

+0

它的語法錯誤是因爲散列作爲第一個參數需要大括號在語法上是準確的。 – vigneshv

-1
@sponsorship = Sponsorship.includes(:backer, patient: [:vaccinations]).find_by_slug(params[:id]) 
+0

儘管此代碼可能會回答這個問題,但提供有關爲何和/或代碼如何回答此問題的其他上下文可提高其長期價值。 – NathanOliver