当执行某些操作时,我使用Web套接字向客户端发送json消息。我希望能够在jbuilder文件中使用视图助手,以便我可以很好地格式化json数据。
如何将视图就绪json转换为控制器中的变量?我提出的最好的方法是使用render_to_string
,但有效,但返回String
,所以我必须做JSON.parse
,这是浪费很多的转换,对吧?
所以我有这个:
msg = JSON.parse(render_to_string('show'))
将show.json.jbuilder
呈现为json,然后将其作为字符串返回,然后将其解析回json。
它有效,但感觉错了!
答案 0 :(得分:0)
我偶然发现了几个小时,也做了一些错误的事情。我有两个可怕的黑客。我遇到的第一个问题是尝试使用jbuilder来构造json,以存储在不在MVC上下文中的有效负载中,但是在sidekiq worker中。幸运的是,我只需要一个表示,所以我基本上在下面显示的user.rb
编辑示例中重建了模板。
def to_builder
Jbuilder.new do |user|
user.external_id id
user.username username
user.full_name full_name
end
end
然后使用
to_user_hash = {}
to_user_hash["user"] = JSON.parse(user.to_builder.target!)
存放json,令人难以置信的愚蠢。
现在更疯狂的是,当我使用active_model_serializers
时,我正在使用sidekiq工作人员通过websockets渲染实时活动页面并执行以下操作。
class ActivityBroadcasterWorker < ApplicationWorker
sidekiq_options queue: :low, retry: true, backtrace: true
def perform(activity_id)
view = ActionView::Base.new(ActionController::Base.view_paths)
view.class_eval("include Rails.application.routes.url_helpers")
view.extend ApplicationHelper
if activity = PublicActivity::Activity.find_by_id(activity_id)
template = view.render_activity(activity)
ActionCable.server.broadcast('activity_channel', message: template)
end
end
end
你有没有找到更好的解决方案,只需告诉jbuilder这里是我的资源,我想渲染这个视图,或者这个视图是否部分?