如何使用jbuilder将视图部分呈现给Rails中控制器中的变量?

时间:2017-04-19 17:26:58

标签: ruby-on-rails jbuilder

当执行某些操作时,我使用Web套接字向客户端发送json消息。我希望能够在jbuilder文件中使用视图助手,以便我可以很好地格式化json数据。

如何将视图就绪json转换为控制器中的变量?我提出的最好的方法是使用render_to_string,但有效,但返回String,所以我必须做JSON.parse,这是浪费很多的转换,对吧?

所以我有这个:

msg = JSON.parse(render_to_string('show'))

show.json.jbuilder呈现为json,然后将其作为字符串返回,然后将其解析回json。

它有效,但感觉错了!

1 个答案:

答案 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这里是我的资源,我想渲染这个视图,或者这个视图是否部分?