添加actioncable时“错误的参数数量”

时间:2017-01-31 08:06:07

标签: ruby-on-rails ruby ruby-on-rails-5 actioncable

我知道,有很多“错误数量的论点”类似问题,但我的不同之处在于我试图通过动作电缆添加实时功能。

我想要完成的是,只要有新项目,就应该在另一个浏览器上自动更新项目列表。

该应用程序部署在 http://rails5-catalog.herokuapp.com

https://catalog-tenzan.c9users.io/items

Github repo https://github.com/tenzan/rails-catalog

我遇到了错误:

enter image description here

当我尝试在@item添加def self.broadcast(item)时,我收到了另一个错误 正式参数不能是实例变量

我做了什么:

rails g channel items

应用/资产/ Javascript角/信道/ items.coffee

App.items = App.cable.subscriptions.create "ItemsChannel",

  received: (data) ->
    # Called when there's incoming data on the websocket for this channel
    $('#items').append data.item

应用/信道/ items_channel.rb

class ItemsChannel < ApplicationCable::Channel
  def self.broadcast(item)
    broadcast.to item, item:
    ItemsController.render(partial: 'items/form', locals: {item: item})
  end

  def subscribed
    stream_for Item.last
  end

应用/控制器/ items_controller.rb

  def create
    @item = Item.new(item_params)
    ItemsChannel.broadcast(@item)
    redirect_to @item

配置/ routes.rb中

Rails.application.routes.draw do
  mount ActionCable.server => '/cable'

1 个答案:

答案 0 :(得分:0)

据我所知,有几个问题。

  1. 错字

    def self.broadcast(item)
      broadcast.to item, item:
    
  2. 您在此处所做的实际上是再次致电broadcast。但没有任何争论。这是导致错误消息的原因。 我相信您想要调用broadcast_to方法(_ vs .)。

    1. 我也相信你还有另一个错字:item, item:
    2. 这是broadcast_to(model, message)的签名,它需要一个模型和一条消息,您的拼写错误导致您将ItemsController.render(partial: 'items/form', locals: {item: item})的任何内容传递给broadcast_to

      你可能想要像

      这样的东西
      broadcast_to item, title: 'New Item', body: "#{item.name} #{item.price}"
      

      代替。

      1. 您未使用以下方法将新创建的项目保存在控制器中:

        @item = Item.new(item_params)
        
      2. 您只是在内存中初始化一个Item对象,为了保留新项目,您想要@item.save它或Item.create(item_params)

        希望这有帮助。