My Rails应用程序通过Action Cable广播一组记录,
ActionCable.server.broadcast 'model_channel', models: (ApplicationController.render 'models/index.json', assigns: { models: Model.all })
我正在调用ApplicationController.render
以确保调用jbuilder
(我在我的models/index.json.jbuilder
文件中添加自定义字段)。
所有工作正常除了broadcast
参数转换为字符串,因此我需要调用JSON.parse(data['models'])
以便在JavaScript处理程序中使用数据。
我可以在Ruby端做些什么来避免字符串ifing我的有效负载然后在客户端解析它?
答案 0 :(得分:1)
我使用以下帮助程序在客户端返回JSON数据
module ChannelHelper
def render_view(params)
ApplicationController.render(params)
end
def render_json(params)
JSON.parse render_view(params)
end
def broadcast channel, message
ActionCable.server.broadcast channel, message
end
end
之后在频道
# Be sure to restart your server when you modify this file. Action Cable runs in a loop that does not support auto reloading.
class NotesChannel < ApplicationCable::Channel
include ChannelHelper
def subscribed
stream_from "notes_channel"
end
def unsubscribed
# Any cleanup needed when channel is unsubscribed
end
def random
broadcast 'notes_channel', render_json(
template: 'notes/ws_random',
locals: { note: Note.random.first }
)
end
end
我的宠物项目提交表明它是如何工作的
https://github.com/DeployRB/Rails5App/commit/14485b2c3311e6bd25e6ce841f2f7ee3f83954ff
答案 1 :(得分:0)
您可以通过将外部构建器实例传递给渲染器来直接使用Jbuilder(即没有该解析步骤),例如在此代码中:
class ReservationChannel < ApplicationCable::Channel
def subscribed
reservation = Reservation.find(params[:reservation_id])
stream_for reservation
end
def self.reservation_update(reservation)
broadcast_to reservation, reservation_data_for_json(reservation)
end
private
def self.reservation_data_for_json(reservation)
Jbuilder.new do |json|
ApplicationController.render(
template: 'reservation/index.jbuilder',
locals: { reservation: reservation, json: json }
)
end.attributes!
end
end
答案 2 :(得分:0)
如果您使用的是典型的Rails脚手架,您可以执行以下操作(此示例假设@model设置为您想要的模型,如在控制器中):
json = ApplicationController.render(partial: 'model/model.json',
locals {model: @model})
JSON.parse(json)