添加 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'
据我所知,有几个问题。
打字错误
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})
returns 传递给 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)
。
希望这对您有所帮助。
我知道,有很多类似 "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'
据我所知,有几个问题。
打字错误
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})
returns 传递给 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)
。
希望这对您有所帮助。