`неправильное количество аргументов` при добавлении 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 ответ
Насколько я могу судить, есть пара вопросов.
Опечатка
def self.broadcast(item) broadcast.to item, item:
То, что вы делаете здесь, на самом деле звонит broadcast
снова. Но без каких-либо аргументов. Вот что вызывает сообщение об ошибке. Я считаю, что вы хотите вызвать метод broadcast_to
вместо (_
против .
).
- Я также считаю, что у вас есть еще одна опечатка:
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}"
вместо.
Вы не сохраняете свой новый элемент в контроллере с помощью:
@item = Item.new(item_params)
Вы только инициализируете объект Item в памяти, чтобы сохранить новый элемент, вы хотите либо @item.save
это или Item.create(item_params)
,
Надеюсь это поможет.