您可以调用Jbuilder来创建本机Rails对象而不是呈现的字符串吗?

时间:2016-08-23 14:14:50

标签: javascript ruby-on-rails json jbuilder actioncable

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我的有效负载然后在客户端解析它?

3 个答案:

答案 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)