当执行某些操作时,我使用 Web 套接字向客户端发送 json 消息。我喜欢能够在 jbuilder 文件中使用 View 助手,以便我可以很好地格式化 json 数据。
如何将可查看的 json 放入 Controller 中的变量中?我想出的最好的方法是使用 render_to_string
, 有效,但返回 String
,所以我必须做 JSON.parse
,这是很多浪费的转换,对吧?
所以我有这个:
msg = JSON.parse(render_to_string('show'))
呈现
show.json.jbuilder
进入 json 然后将其作为字符串返回,然后将其解析回 json。它有效,但感觉太糟糕了!
最佳答案
我跌跌撞撞了几个小时,也做了一些错误的事情。我有两个可怕的黑客。我遇到的第一个问题是尝试使用 jbuilder 构建要存储在不在 MVC 上下文中,而是在 sidekiq 工作器中的有效负载中的 json。幸运的是,我只需要一个表示,所以我基本上重建了 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 这里是我的资源,我想呈现这个 View ,或者这个 View 部分?
关于ruby-on-rails - 如何使用 jbuilder 在 Rails 的 Controller 中呈现部分到变量的 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43502361/