【问题标题】:How to use jbuilder to render a view partial to a variable in the controller in Rails?如何使用 jbuilder 将视图部分呈现给 Rails 控制器中的变量?
【发布时间】:2017-09-16 01:47:29
【问题描述】:

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

如何将可查看的 json 放入控制器中的变量中?我想出的最好方法是使用render_to_string,它可以工作,但返回一个String,所以我必须使用JSON.parse,这会浪费很多转换,对吧?

所以我有这个:

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

show.json.jbuilder渲染成json,然后作为字符串返回,然后再解析回json。

有效,但感觉很不对劲!

【问题讨论】:

    标签: ruby-on-rails jbuilder


    【解决方案1】:

    我跌跌撞撞地走了好几个小时,还做错了事。我有两个可怕的黑客。我遇到的第一个问题是尝试使用 jbuilder 构造 json 以存储在不在 MVC 上下文中而是在 sidekiq 工作程序中的有效负载中。幸运的是,我只需要一种表示形式,因此我基本上在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 这里是我的资源,我想渲染这个视图,或者这个视图的一部分?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-06
      • 2017-02-22
      • 2014-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多