你能调用Jbuilder来创建一个原生Rails对象而不是一个呈现的字符串吗?
Can you invoke Jbuilder to create a native Rails object instead of a rendered string?
我的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端做些什么来避免字符串化我的有效负载,然后在客户端解析它?
您可以通过将外部构建器实例传递给呈现器来直接使用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
我使用以下帮助程序在客户端返回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如果您正在使用典型的Rails脚手架,您可以这样做(本示例假设@model被设置为您想要的模型,就像在控制器中一样):
json = ApplicationController.render(partial: 'model/model.json',
locals {model: @model})
JSON.parse(json)
- NodeJS在一个较大的字符串中获取一个字符串的索引
- Javascript:用while循环在给定的count参数中重复一个字符串
- 如何使用另一个字符串作为模板从字符串中提取数据
- 如何检查一个字符串的所有字符是否都存在于另一个字符串中
- 从表单中动态生成一个字符串,传递给通过AJAX加载的PHP文件
- 我可以使用JS一次使用JSON数组中的一个字符串吗
- 将字符串转换为数组使用javascript更新一个值并返回一个字符串
- 如何在JavaScript中每隔第n个字符分割一个字符串
- 我需要使用什么语法来向一个对象的成员添加一个临时数组,该成员等同于一个字符串的通用列表
- 使用Jquery从所有元素创建一个字符串
- 在Javascript中截断一个字符串,混淆了最后两个测试字符串
- Javascript使用本地存储,回调对象并用Json更改为一个字符串以用于填充函数
- 将一个字符串数组解析为一个新的数组javascript
- 我可以在两个javascript文件之间传递一个字符串吗?
- 如何拆分一个字符串,然后将它们与另一个字符串匹配
- get没有方法“writefile”,即使输入是一个字符串
- 将 url 中的一个字符串替换为另一个字符串
- 如何在 javascript 中使用正则表达式在其他两个字符串之间找到一个字符串
- “JSON.parse(str)”返回“意外令牌c”,但str是一个字符串
- 递归查找嵌套数组中的最后一个字符串