【问题标题】:NoMethodError (undefined method `fetch' for nil:NilClass)NoMethodError(nil:NilClass 的未定义方法“获取”)
【发布时间】:2018-03-05 11:45:07
【问题描述】:

问题在于使用 ActionCable 通过 Web 套接字广播数据。该错误似乎表明它来自 create 方法。

错误信息

 Rendered weight/_weight.html.erb (1.1ms)
 [ActionCable] Broadcasting to weight: "<div class=\"row\">\n  <div class=\"col-md-8 well\">\n    <p>12.0 kg</p>\n    <small>less than a minute</small>\n  </div>\n</div>"
Completed 500 Internal Server Error in 25ms (Views: 7.4ms | ActiveRecord: 10.6ms)



NoMethodError (undefined method `fetch' for nil:NilClass):

app/controllers/weight_controller.rb:7:in `create'
Rendering /usr/local/rvm/gems/ruby-2.3.4/gems/actionpack-5.0.4/lib/action_dispatch/middleware/templates/rescues/diagnostics.text.erb
Rendering /usr/local/rvm/gems/ruby-2.3.4/gems/actionpack-5.0.4/lib/action_dispatch/middleware/templates/rescues/_source.text.erb
Rendered /usr/local/rvm/gems/ruby-2.3.4/gems/actionpack-5.0.4/lib/action_dispatch/middleware/templates/rescues/_source.text.erb (0.8ms)
Rendering /usr/local/rvm/gems/ruby-2.3.4/gems/actionpack-5.0.4/lib/action_dispatch/middleware/templates/rescues/_trace.text.erb
Rendered /usr/local/rvm/gems/ruby-2.3.4/gems/actionpack-5.0.4/lib/action_dispatch/middleware/templates/rescues/_trace.text.erb (0.9ms)
Rendering /usr/local/rvm/gems/ruby-2.3.4/gems/actionpack-5.0.4/lib/action_dispatch/middleware/templates/rescues/_request_and_response.text.erb
Rendered /usr/local/rvm/gems/ruby-2.3.4/gems/actionpack-5.0.4/lib/action_dispatch/middleware/templates/rescues/_request_and_response.text.erb (1.1ms)
Rendered /usr/local/rvm/gems/ruby-2.3.4/gems/actionpack-5.0.4/lib/action_dispatch/middleware/templates/rescues/diagnostics.text.erb (25.0ms)

从 controller.rb 创建方法

def create
   @weight = Weight.new(weight_params)
   @weight.user_id = current_user.id
    if @weight.save
        ActionCable.server.broadcast "weight", render(partial: 'weight/weight', object: @weight)

    else
        flash[:danger] = "New Weight was not added!"
        redirect_to current_user
    end
end

private

def weight_params
    params.require(:weights).permit(:weight)
end

我只是无法计算出返回为 nil 的内容。信息在广播到重量的内容中是正确的这一事实表明它已正确地将其保存到数据库中。想不出还有什么它正在执行“获取”方法。

非常确定网络套接字设置正确。见下文。

config/application.rb:

config.action_cable.mount_path = '/cable'

config/routes.rb:

mount ActionCable.server => '/cable'

weight_channel.rb:

def subscribed
  stream_from "weight"
end

weight.coffee:

 received: (data) -> 
    $("#messages").prepend(data)

【问题讨论】:

  • weight_controller.rb 文件的第 7 行是第 7 行吗?你在哪里(如果)打电话给fetch? (在视图中?在模型中?在save 调用的验证中)?
  • 第 7 行是上述摘录中的第 5 行。我没有在任何地方使用 fetch。
  • 出于调试目的,请考虑将renderbroadcast 分开并将它们放在两个不同的行中。即:tmp = render(partial: 'weight/weight', object: @weight) new line ActionCable.server.broadcast "weight", tmp...让我们知道哪一行(哪个方法调用)引发了新错误。
  • 感谢您的建议,这行代码 ActionCable.server.broadcast "weight", @tmp - 这是否意味着它与 Web 套接字的设置方式有关?跨度>
  • 您的日志中应该有完整的堆栈跟踪(不仅仅是一行app/controllers/weight_controller.rb:7:in create'`) - 您可以将它粘贴到您的问题中吗?

标签: ruby-on-rails websocket actioncable


【解决方案1】:

由于缺少config/cable.yml 文件而引发错误。

解决方案是使用具有应用程序所需设置的config/cable.yml。即:

# Action Cable uses Redis by default to administer connections, channels, and sending/receiving messages over the WebSocket.
production:
  adapter: redis
  url: redis://localhost:6379/1

development:
  adapter: redis
  url: redis://localhost:6379/1

staging:
  adapter: redis
  url: redis://localhost:6379/1

test:
  adapter: async

分辨率出现在问题的 cmets 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-14
    • 2013-01-14
    • 2017-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多