特定参数顺序的语法错误

Syntax error with specific argument order

使用此代码:

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

我得到 syntax error, unexpected ')', expecting =>。但是当我像这样改变参数的顺序时:

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

错误消失了。为什么语法错误取决于参数的顺序?

那是无效的 ruby 语法。你的意思可能是:

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

注意patient::patient =>是一样的,都是散列的关键部分。所以 ruby 期望下一个是哈希值的一半,而不是事物列表。我将其更改为数组(不确定这是否是您的意思)。

因为如果您依赖 Ruby 语法糖来避免自己编写 {},那么散列参数必须是最后一个参数。

includes 方法期望找到散列作为最后一个参数。您必须这样传递哈希。否则你必须把 {} 放在散列周围。

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

您有两个有效的选择:

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

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

第一次有 2 个参数,第一个是散列,第二个是值,

在第二个例子中你仍然有 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 } 语法。