【问题标题】:`wrong number of arguments` when adding actioncable添加可操作时的“参数数量错误”
【发布时间】:2017-01-31 08:06:07
【问题描述】:

我知道,有很多“参数数量错误”之类的问题,但我的不同,因为我正在尝试使用动作电缆添加实时功能。

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

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

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

Github 仓库https://github.com/tenzan/rails-catalog

我遇到了错误:

当我尝试在def self.broadcast(item) 处为item 添加@ 时,我遇到了另一个错误formal argument cannot be an instance variable

我做了什么:

rails g channel items

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

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'

【问题讨论】:

  • 我没有使用过动作电缆,所以我的猜测是,这是因为您正在向new Object 广播,而不是持续广播。而且所有人都订阅了Item.last,所以我猜他们不会收到更新,除非你订阅他们到一个更具体的频道实例,因为你不总是广播到那个特定的Item
  • 是的,我在您的 create 操作中看不到 @item.save。它是如何与动作电缆一起工作的吗?我不确定。
  • 感谢大家的宝贵时间。根据我在下面的评论,错误已被消除,但我现在面临可操作的使用问题。一有发现就会更新。

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


【解决方案1】:

据我所知,有几个问题。

  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}) 返回的任何东西传递给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)

希望这会有所帮助。

【讨论】:

  • 感谢您的回答。我已经按照建议进行了重构。没有更多错误,但动作电缆功能还没有工作......将阅读更多关于它的信息。
  • 很高兴它有帮助,您介意标记一下吗?由于 ActionCable 不工作是一个不同的问题。
猜你喜欢
  • 2019-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-13
  • 2018-12-10
  • 1970-01-01
相关资源
最近更新 更多