`неправильное количество аргументов` при добавлении actioncable

Я знаю, что существует множество проблем, подобных "неправильному количеству аргументов", но у меня все по-другому, потому что я пытаюсь добавить функциональность в реальном времени с помощью кабеля действий.

Что именно я хочу сделать, так это то, что как только новый элемент добавлен, список элементов должен автоматически обновляться в другом браузере.

Приложение развернуто на http://rails5-catalog.herokuapp.com/

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

Репозиторий Github https://github.com/tenzan/rails-catalog

У меня ошибка:

Когда я попытался добавить @ за item в def self.broadcast(item) Я получил другую ошибку формальный аргумент не может быть переменной экземпляра.

Что я сделал:

rails g channel items

приложение / активы / JavaScripts / каналы / 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 ответ

Решение

Насколько я могу судить, есть пара вопросов.

  1. Опечатка

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

То, что вы делаете здесь, на самом деле звонит broadcast снова. Но без каких-либо аргументов. Вот что вызывает сообщение об ошибке. Я считаю, что вы хотите вызвать метод broadcast_to вместо (_ против .).

  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),

Надеюсь это поможет.

Другие вопросы по тегам