Sinatra-ROM项目中CreateProduct类方法未识别,是否缺失依赖Gem?
问题描述
我正在学习Sinatra和ROM框架,已fork了sinatra-rom项目。使用bundle exec rackup命令启动程序时,db/commands/products/create.rb文件抛出错误:
undefined method relation for CreateProduct:Class (NoMethodError) relation :products
其中relation :products和register_as :create这两个声明均不被识别。
该文件开头代码如下:
class CreateProduct < ROM::SQL::Commands::Create[:sql] relation :products register_as :create ...
项目的Gemfile内容:
source "https://rubygems.org" gem 'bundler' gem 'sinatra' gem 'rom', github: 'rom-rb/rom' gem 'rom-sql', github: 'rom-rb/rom-sql' gem 'virtus' gem 'lotus-validations' # gem 'puma' gem 'dotenv' gem 'multi_json' gem 'oj' gem 'activesupport' gem 'bcrypt' group :development, :test do gem 'sqlite3' end group :test do gem 'rspec' gem 'rack-test' gem 'database_cleaner' end
从Gemfile.lock可知,当前使用的是ROM 6.0.0.alpha1和rom-sql 4.0.0.alpha1版本。
问题原因与解决办法
不是缺失Gem依赖,问题出在ROM版本不兼容。
你使用的ROM 6.x预览版(alpha1)已经彻底重构了命令定义逻辑,relation :products和register_as :create这类类方法是ROM 5.x及更早版本的语法,6.x不再支持。
有两种解决途径:
降级到稳定版:修改Gemfile,指定ROM和rom-sql的稳定版本,比如:
gem 'rom', '~> 5.3' gem 'rom-sql', '~> 3.4'执行
bundle update rom rom-sql后,就能匹配项目原本的命令语法,这是新手最稳妥的选择。适配6.x语法:如果坚持用alpha版本,需要重构命令类,6.x中命令需通过schema配置块声明,示例:
class CreateProduct < ROM::SQL::Commands::Create relation :products register_as :create schema(:products, infer: true) end注意:alpha版本语法不稳定,后续可能变动,不推荐新手尝试。
内容的提问来源于stack exchange,提问作者Mike Slinn
相关产品推荐
相关产品推荐

