我正在尝试在rails应用程序中使用twilio。作为开发的一部分,我使用一些硬编码值设置了一个简单的控制器(提交POST请求的表单中的输入基本上被忽略)。这是控制器的代码:
class SmsController < ApplicationController
def send (dummy)
twilio_sid = "removed-for-privacy-reasons"
twilio_token = "removed-for-privacy-reasons"
twilio_phone_number = "removed-for-privacy-reasons"
number_to_send_to = "removed-for-privacy-reasons"
@twilio_client = Twilio::REST::Client.new twilio_sid, twilio_token
@twilio_client.account.sms.messages.create(
:from => twilio_phone_number,
:to => number_to_send_to,
:body => "This is a test of SendTextController"
)
end
end
控制器工作正常 - 我在手机上收到了硬编码短信。但是,我在网络表单中收到以下异常:
未定义的方法`空?&#39; for Twilio :: REST :: SMS ::消息:0x007f8df0e743b8
完整的堆栈跟踪在这里:
Application Trace | Framework Trace | Full Trace
twilio-ruby (3.12.2) lib/twilio-ruby/rest/instance_resource.rb:68:in `method_missing'
activesupport (4.1.5) lib/active_support/callbacks.rb:81:in `run_callbacks'
actionpack (4.1.5) lib/abstract_controller/callbacks.rb:19:in `process_action'
actionpack (4.1.5) lib/action_controller/metal/rescue.rb:29:in `process_action'
actionpack (4.1.5) lib/action_controller/metal/instrumentation.rb:31:in `block in process_action'
activesupport (4.1.5) lib/active_support/notifications.rb:159:in `block in instrument'
activesupport (4.1.5) lib/active_support/notifications/instrumenter.rb:20:in `instrument'
activesupport (4.1.5) lib/active_support/notifications.rb:159:in `instrument'
actionpack (4.1.5) lib/action_controller/metal/instrumentation.rb:30:in `process_action'
actionpack (4.1.5) lib/action_controller/metal/params_wrapper.rb:250:in `process_action'
activerecord (4.1.5) lib/active_record/railties/controller_runtime.rb:18:in `process_action'
actionpack (4.1.5) lib/abstract_controller/base.rb:136:in `process'
actionview (4.1.5) lib/action_view/rendering.rb:30:in `process'
actionpack (4.1.5) lib/action_controller/metal.rb:196:in `dispatch'
actionpack (4.1.5) lib/action_controller/metal/rack_delegation.rb:13:in `dispatch'
actionpack (4.1.5) lib/action_controller/metal.rb:232:in `block in action'
actionpack (4.1.5) lib/action_dispatch/routing/route_set.rb:82:in `call'
actionpack (4.1.5) lib/action_dispatch/routing/route_set.rb:82:in `dispatch'
actionpack (4.1.5) lib/action_dispatch/routing/route_set.rb:50:in `call'
actionpack (4.1.5) lib/action_dispatch/journey/router.rb:71:in `block in call'
actionpack (4.1.5) lib/action_dispatch/journey/router.rb:59:in `each'
actionpack (4.1.5) lib/action_dispatch/journey/router.rb:59:in `call'
actionpack (4.1.5) lib/action_dispatch/routing/route_set.rb:678:in `call'
rack (1.5.2) lib/rack/etag.rb:23:in `call'
rack (1.5.2) lib/rack/conditionalget.rb:35:in `call'
rack (1.5.2) lib/rack/head.rb:11:in `call'
actionpack (4.1.5) lib/action_dispatch/middleware/params_parser.rb:27:in `call'
actionpack (4.1.5) lib/action_dispatch/middleware/flash.rb:254:in `call'
rack (1.5.2) lib/rack/session/abstract/id.rb:225:in `context'
rack (1.5.2) lib/rack/session/abstract/id.rb:220:in `call'
actionpack (4.1.5) lib/action_dispatch/middleware/cookies.rb:560:in `call'
activerecord (4.1.5) lib/active_record/query_cache.rb:36:in `call'
activerecord (4.1.5) lib/active_record/connection_adapters/abstract/connection_pool.rb:621:in `call'
activerecord (4.1.5) lib/active_record/migration.rb:380:in `call'
actionpack (4.1.5) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call'
activesupport (4.1.5) lib/active_support/callbacks.rb:82:in `run_callbacks'
actionpack (4.1.5) lib/action_dispatch/middleware/callbacks.rb:27:in `call'
actionpack (4.1.5) lib/action_dispatch/middleware/reloader.rb:73:in `call'
actionpack (4.1.5) lib/action_dispatch/middleware/remote_ip.rb:76:in `call'
actionpack (4.1.5) lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call'
actionpack (4.1.5) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
railties (4.1.5) lib/rails/rack/logger.rb:38:in `call_app'
railties (4.1.5) lib/rails/rack/logger.rb:20:in `block in call'
activesupport (4.1.5) lib/active_support/tagged_logging.rb:68:in `block in tagged'
activesupport (4.1.5) lib/active_support/tagged_logging.rb:26:in `tagged'
activesupport (4.1.5) lib/active_support/tagged_logging.rb:68:in `tagged'
railties (4.1.5) lib/rails/rack/logger.rb:20:in `call'
actionpack (4.1.5) lib/action_dispatch/middleware/request_id.rb:21:in `call'
rack (1.5.2) lib/rack/methodoverride.rb:21:in `call'
rack (1.5.2) lib/rack/runtime.rb:17:in `call'
activesupport (4.1.5) lib/active_support/cache/strategy/local_cache_middleware.rb:26:in `call'
rack (1.5.2) lib/rack/lock.rb:17:in `call'
actionpack (4.1.5) lib/action_dispatch/middleware/static.rb:64:in `call'
rack (1.5.2) lib/rack/sendfile.rb:112:in `call'
railties (4.1.5) lib/rails/engine.rb:514:in `call'
railties (4.1.5) lib/rails/application.rb:144:in `call'
rack (1.5.2) lib/rack/lock.rb:17:in `call'
rack (1.5.2) lib/rack/content_length.rb:14:in `call'
rack (1.5.2) lib/rack/handler/webrick.rb:60:in `service'
/Users/nnikolo/.rvm/rubies/ruby-2.0.0-p451/lib/ruby/2.0.0/webrick/httpserver.rb:138:in `service'
/Users/nnikolo/.rvm/rubies/ruby-2.0.0-p451/lib/ruby/2.0.0/webrick/httpserver.rb:94:in `run'
/Users/nnikolo/.rvm/rubies/ruby-2.0.0-p451/lib/ruby/2.0.0/webrick/server.rb:295:in `block in start_thread'
有another SO thread reporting a similar problem,但那里提供的解决方案都不适用于我。你能帮忙吗?
答案 0 :(得分:3)
Twilio Evangelist在这里。
这真的很有趣。
首先快速注意:您使用的是SMS
资源which is deprecated in favour of Messages
。您应该使用以下内容:
@twilio_client = Twilio::REST::Client.new twilio_sid, twilio_token
@twilio_client.account.messages.create(
:from => twilio_phone_number,
:to => number_to_send_to,
:body => "This is a test of SendTextController"
)
注意我删除了.SMS
部分。
其次,我承认我无法完全解释细节,我强烈怀疑使用send
因为你的行动名称正在调用各种混乱。 #send
来自Object,在这里你覆盖它,但Rails将它用于控制器上的各种不同回调。我注意到您已将(dummy)
添加到您的签名中,但Ruby doesn't support method overloading。
我不知道为什么,但似乎可能成为问题。我用你的控制器创建了一个简单的Rails 4.0.4,我有一个类似的问题:
undefined method `compile' for #<Twilio::REST::SMS::Message:0x007fea132761e0>
Rails.root: ~/so26076867
Application Trace | Framework Trace | Full Trace
twilio-ruby (3.12.2) lib/twilio-ruby/rest/instance_resource.rb:68:in `method_missing'
activesupport (4.0.4) lib/active_support/callbacks.rb:369:in `__define_callbacks'
activesupport (4.0.4) lib/active_support/callbacks.rb:79:in `run_callbacks'
actionpack (4.0.4) lib/abstract_controller/callbacks.rb:17:in `process_action'
actionpack (4.0.4) lib/action_controller/metal/rescue.rb:29:in `process_action'
actionpack (4.0.4) lib/action_controller/metal/instrumentation.rb:31:in `block in process_action'
activesupport (4.0.4) lib/active_support/notifications.rb:159:in `block in instrument'
activesupport (4.0.4) lib/active_support/notifications/instrumenter.rb:20:in `instrument'
activesupport (4.0.4) lib/active_support/notifications.rb:159:in `instrument'
actionpack (4.0.4) lib/action_controller/metal/instrumentation.rb:30:in `process_action'
actionpack (4.0.4) lib/action_controller/metal/params_wrapper.rb:250:in `process_action'
我的rails应用程序没有ActiveRecord,因此可以解释一些差异。但是注意到堆栈跟踪的顶部都来自Rails中的回调代码。当我将动作重命名为test_sms时,它起作用了:
def test_sms
twilio_sid = "xxxx"
twilio_token = "yyyy"
twilio_phone_number = "zzzz"
number_to_send_to = "...."
@twilio_client = Twilio::REST::Client.new twilio_sid, twilio_token
@twilio_client.account.sms.messages.create(
:from => twilio_phone_number,
:to => number_to_send_to,
:body => "This is a test of SendTextController"
)
end
我有兴趣听听这是否适合你。我偶然在命名方法send
时看到Ruby和Rails中的奇怪行为,它似乎总是会引起混乱。究竟为什么你会收到这个错误,我不确定。这可能会破坏Rails中的某些东西。我将在本周调查一下,看看能否弄明白。
让我知道这是否有效,否则我会有另一个裂缝。
答案 1 :(得分:0)
xmjw的回答指出了它。我得到了来自Twilio支持的Alex Chan的同样建议。然而,Xmjw的答案更全面,因为它提到了已弃用的API版本。
我需要提一下,我从Twilio's own blog复制了控制器的代码,但我没有特别重新命名控制器方法来“发送”。代码产生“错误的参数数量(1表示0)”,因此我在“发送”方法中添加了一个虚拟参数。
我遵循了Xmjw和Alex Chan的建议并重新命名了控制器方法。我在Twilio博客的代码片段中使用了名称“send-text_message”。我开始得到“缺少模板”,但这与twilio无关。把
head :ok
在send_text_message方法的末尾删除了该错误消息。我从Template is missing的一个回复中得到了这个。
简而言之 - Twilio博客上的代码片段有些过时,但是对于Xmjw和twilio的Alex Chan的回复将其排除在外。看到对Twilio API的这种良好支持真的很令人鼓舞。我很高兴与它合作 - 谢谢你们,伙计们!