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

sam*_*ker 3 javascript json ruby-on-rails jbuilder actioncable

我的 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 端做些什么来避免对我的有效负载进行字符串化然后在客户端解析它?

ino*_*tus 6

您可以通过将外部构建器实例传递给渲染器来直接使用 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
Run Code Online (Sandbox Code Playgroud)