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

`wrong number of arguments` when adding actioncable

我知道,有很多类似 "wrong number of arguments" 的问题,但我的情况不同,因为我正在尝试使用动作电缆添加实时功能。

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

应用部署于 http://rails5-catalog.herokuapp.com

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

Github 回购 https://github.com/tenzan/rails-catalog

我有错误:

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

我做了什么:

rails g channel items

app/assets/javascripts/channels/items.咖啡

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

app/channels/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

app/controllers/items_controller.rb

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

config/routes.rb

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

据我所知,有几个问题。

  1. 打字错误

    def self.broadcast(item)
      broadcast.to item, item:
    

您在这里所做的实际上是再次调用 broadcast。但没有任何争论。这就是导致错误消息的原因。 我相信您想改为调用方法 broadcast_to_ vs .)。

  1. 我还相信你还有一个错别字:item, item:

这是 broadcast_to(model, message) 的签名,它需要一个模型和一条消息,您的错字导致您将任何 ItemsController.render(partial: 'items/form', locals: {item: item}) returns 传递给 broadcast_to

你可能想要这样的东西

broadcast_to item, title: 'New Item', body: "#{item.name} #{item.price}"

相反。

  1. 您没有将新创建的项目保存在控制器中:

    @item = Item.new(item_params)
    

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

希望这对您有所帮助。