Ruby on Rails创建新应用遇语法错误,寻求解决办法
Rails 7.1.x 创建项目时的语法错误解决
问题详情
执行命令创建Rails项目:
rails new abc -d mysql
环境信息:
- Ruby版本:
2.7.0 - 尝试的Rails版本:
7.1.3.2、7.1.5.1
错误触发前控制台输出:
rails importmap:install
完整错误信息:
bin/rails aborted! SyntaxError: /var/lib/gems/2.7.0/gems/activerecord-7.1.5.1/lib/active_record/attribute_methods.rb:482: syntax error, unexpected (... ... def method_missing(name, ...) ... ^~~ /var/lib/gems/2.7.0/gems/activerecord-7.1.5.1/lib/active_record/attribute_methods.rb:491: unexpected ... /var/lib/gems/2.7.0/gems/activerecord-7.1.5.1/lib/active_record/attribute_methods.rb:495: syntax error, unexpected ')' ... return public_send(name, ...) ... ^ /var/lib/gems/2.7.0/gems/activerecord-7.1.5.1/lib/active_record/attribute_methods.rb:551: syntax error, unexpected end-of-input, expecting `end' /var/lib/gems/2.7.0/gems/bootsnap-1.18.4/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require' /var/lib/gems/2.7.0/gems/bootsnap-1.18.4/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require' /var/lib/gems/2.7.0/gems/activerecord-7.1.5.1/lib/active_record.rb:128:in `<module:ActiveRecord>' /var/lib/gems/2.7.0/gems/activerecord-7.1.5.1/lib/active_record.rb:38:in `<main>' /var/lib/gems/2.7.0/gems/bootsnap-1.18.4/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require' /var/lib/gems/2.7.0/gems/bootsnap-1.18.4/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require' /var/lib/gems/2.7.0/gems/activerecord-7.1.5.1/lib/active_record/railtie.rb:3:in `<main>' /var/lib/gems/2.7.0/gems/bootsnap-1.18.4/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require' /var/lib/gems/2.7.0/gems/bootsnap-1.18.4/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require' /var/lib/gems/2.7.0/gems/railties-7.1.5.1/lib/rails/all.rb:20:in `block in <main>' /var/lib/gems/2.7.0/gems/railties-7.1.5.1/lib/rails/all.rb:18:in `each' /var/lib/gems/2.7.0/gems/railties-7.1.5.1/lib/rails/all.rb:18:in `<main>' /var/lib/gems/2.7.0/gems/bootsnap-1.18.4/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require' /var/lib/gems/2.7.0/gems/bootsnap-1.18.4/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require' /home/akanksha/Work/Projects/materials_generator/abc/config/application.rb:3:in `<main>' /home/akanksha/Work/Projects/materials_generator/abc/Rakefile:4:in `require_relative' /home/akanksha/Work/Projects/materials_generator/abc/Rakefile:4:in `<main>' /var/lib/gems/2.7.0/gems/railties-7.1.5.1/lib/rails/commands/rake/rake_command.rb:43:in `block in with_rake' /var/lib/gems/2.7.0/gems/railties-7.1.5.1/lib/rails/commands/rake/rake_command.rb:41:in `with_rake' /var/lib/gems/2.7.0/gems/railties-7.1.5.1/lib/rails/commands/rake/rake_command.rb:20:in `perform' /var/lib/gems/2.7.0/gems/railties-7.1.5.1/lib/rails/command.rb:156:in `invoke_rake' /var/lib/gems/2.7.0/gems/railties-7.1.5.1/lib/rails/command.rb:73:in `block in invoke' /var/lib/gems/2.7.0/gems/railties-7.1.5.1/lib/rails/command.rb:149:in `with_argv' /var/lib/gems/2.7.0/gems/railties-7.1.5.1/lib/rails/command.rb:69:in `invoke' /var/lib/gems/2.7.0/gems/railties-7.1.5.1/lib/rails/commands.rb:18:in `<main>' /var/lib/gems/2.7.0/gems/bootsnap-1.18.4/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require' /var/lib/gems/2.7.0/gems/bootsnap-1.18.4/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require' bin/rails:4:in `<main>' (See full trace by running task with --trace)
错误原因
Rails 7.1.x 版本引入了Ruby 3.0+专属的省略号参数语法(...),比如def method_missing(name, ...)这种写法,而Ruby 2.7.0并不支持该语法,导致ActiveRecord代码加载时触发语法错误。
解决方法
方案一:升级Ruby版本(推荐)
Rails 7.1官方要求最低Ruby版本为3.0.0,将Ruby升级到3.0或更高版本(如3.1、3.2)即可解决该兼容性问题。方案二:降级Rails版本
如果暂时无法升级Ruby,可将Rails版本降级到7.0.x系列(该系列兼容Ruby 2.7.0),创建项目时指定版本:rails _7.0.8_ new abc -d mysql
内容的提问来源于stack exchange,提问作者Akanksha
相关产品推荐
相关产品推荐

