我知道,有很多“错误数量的论点”类似问题,但我的不同之处在于我试图通过动作电缆添加实时功能。
我想要完成的是,只要有新项目,就应该在另一个浏览器上自动更新项目列表。
该应用程序部署在 http://rails5-catalog.herokuapp.com
https://catalog-tenzan.c9users.io/items
Github repo https://github.com/tenzan/rails-catalog
我遇到了错误:
当我尝试在@
为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'
答案 0 :(得分:0)
据我所知,有几个问题。
错字
def self.broadcast(item)
broadcast.to item, item:
您在此处所做的实际上是再次致电broadcast
。但没有任何争论。这是导致错误消息的原因。
我相信您想要调用broadcast_to
方法(_
vs .
)。
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)
。
希望这有帮助。