Rails:来自“has_many”的意外 tSYMBEG 错误

Posted

技术标签:

【中文标题】Rails:来自“has_many”的意外 tSYMBEG 错误【英文标题】:Rails: Unexpected tSYMBEG error from "has_many" 【发布时间】:2022-01-16 03:46:02 【问题描述】:

我用的是Windows10+Ubuntu18.04

我在模型中设置了“has_many”,但启动rails控制台时出现错误消息:

/home/keaton/.rvm/rubies/ruby-2.6.6/bin/ruby: warning: shebang line ending with \r may cause problems
/home/keaton/.rvm/gems/ruby-2.6.6/gems/bootsnap-1.9.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `require': /mnt/c/projects/Kasuri/app/models/user.rb:8: syntax error, unexpected tSYMBEG, expecting do or '' or '('
  has_many :spaces, through: :space_users
           ^ (SyntaxError)

但我确定我没有拼写错误,rb文件的源代码如下:

class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
         #:recoverable, :rememberable, :validatable

  has_many :space_users, dependent: :destroy
  has_many :spaces, through: :space_users
  has_many :channel_users, dependent: :destroy
    has_many :channels, through: :channel_users
  has_many :messages, dependent: :destroy
end

我正在使用 Devise 来制作登录功能。这是异常的原因吗?谢谢!

【问题讨论】:

【参考方案1】:

当下一行被注释掉时,你有一个尾随逗号:

devise :database_authenticatable, :registerable,

这会导致下一个表达式 has_many :space_users, dependent: :destroy 被视为您将其作为参数传递给 devise 方法。所以解析器实际看到的是:

devise :database_authenticatable, :registerable, has_many :space_users, dependent: :destroy

括号在嵌套方法调用中不是可选的:

foo :a, bar :b
# (irb):34: syntax error, unexpected symbol literal, expecting `do' or '' or '(' (SyntaxError)   

# works
foo :a, bar(:b)

【讨论】:

一般不要注释掉未使用的代码——删除它。如果您再次需要它,它会出现在您的 git 历史记录中。

以上是关于Rails:来自“has_many”的意外 tSYMBEG 错误的主要内容,如果未能解决你的问题,请参考以下文章

Rails:为啥“has_many ...,:通过=> ...”关联导致“NameError:未初始化的常量...”

Rails 中的 has_many 关联迁移

Ruby-on-Rails:多个 has_many :通过可能吗?

Rails 4:加入 has_many 关系

Rails RSpec 测试 has_many :through 关系

通过 has_many 的 Rails 4 应用程序