ruby-on-rails - 如何使用 jbuilder 在 Rails 的 Controller 中呈现部分到变量的 View ?

标签 ruby-on-rails jbuilder

当执行某些操作时,我使用 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/

相关文章:

ruby-on-rails - Rails simple_form text_area 不显示错误

javascript - Jquery-UI 的 _render 函数在自动完成中不起作用

ruby-on-rails - 如何在 Rails 3.2 中使用 JBuilder 渲染 json

ruby-on-rails - 在 View 中渲染 Rails 模型关联

caching - Jbuilder Rails 缓存速度较慢

ruby-on-rails - rails jbuilder : how to build a JSON from an array with the key equals to the array values

ruby-on-rails - 如何在JBuilder中使用RSpec?

ruby-on-rails - 如何编写 Devise 扩展(使用自定义数据存储)

ruby-on-rails - RoR有没有办法在路由中添加一些可选参数?

ruby-on-rails - 从共享的局部 View 或替代解决方案中删除条件逻辑