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:未初始化的常量...”
Ruby-on-Rails:多个 has_many :通过可能吗?