Rails中使用Nexmo gem报错:undefined method `send_message',求排查
解决Rails中Nexmo gem提示"Undefined method send_message"的问题
这个问题大概率是因为Nexmo(现已更名为Vonage)的gem版本更新后,API方法名发生了变更——旧的send_message方法在新版本中已经被弃用了。下面是具体的排查和解决步骤:
1. 确认gem版本与迁移情况
Nexmo官方已经将gem迁移到了Vonage品牌下,现在推荐使用vonage gem而非旧的nexmo gem。如果你最近升级了gem,或者Gemfile里没有指定固定版本,就会遇到方法不存在的问题:
- 检查你的Gemfile:如果是
gem 'nexmo',现在它其实是vonagegem的别名,版本已经更新到了最新的Vonage API规范; - 如果是
gem 'vonage',那肯定是用的新API,旧方法自然失效。
2. 修改代码适配新API
客户端初始化调整
旧版本的初始化方式:
nexmo = Nexmo::Client.new( key: 'xxxxxxx', secret: 'xxxxxxx' )
新版本(Vonage gem)需要调整参数名和类名:
nexmo = Vonage::Client.new( api_key: 'xxxxxxx', api_secret: 'xxxxxxx' )
发送短信的方法调整
旧的send_message方法已经被替换为sms.send,修改你的发送逻辑:
# 旧代码 response = nexmo.send_message( from: "SENDERID", to: @number, text: notification ) # 新代码 response = nexmo.sms.send( from: "SENDERID", to: @number, text: notification )
响应处理的小调整
新版本的响应对象结构略有变化,原来的哈希访问方式可以改成更面向对象的调用(两种方式都兼容,但面向对象写法更推荐):
# 旧的响应检查 if response['messages'].first['status'] == '0' # 新版本写法 if response.messages.first.status == '0'
3. 如需保留旧版本API
如果你暂时不想适配新API,可以在Gemfile中指定旧版nexmo gem的版本,比如锁定到5.x系列(这是最后一批支持send_message的版本):
gem 'nexmo', '~> 5.0.0'
然后执行bundle install回滚版本,就能继续使用原来的代码逻辑。
内容的提问来源于stack exchange,提问作者Rahul Lakhaney
相关产品推荐
相关产品推荐

