【问题标题】:How to use Jbuilder to save output for later如何使用 Jbuilder 保存输出以供以后使用
【发布时间】:2020-09-15 22:59:55
【问题描述】:

我想将 json 保存到数据库字段中以供以后使用。我应该如何使用 Jbuilder 来解决这个问题?

我想使用一个项目的显示模板,传入对象 @item 以将该项目的输出保存到数据库中以供以后使用。

我得到了以下代码的一些输出:

view_paths = Rails::Application::Configuration.new(Rails.root).paths["app/views"]
av_helper = ActionView::Base.new view_paths
include Rails.application.routes.url_helpers
@job = Job.find(239)
output = av_helper.render(file: '/api/jobs/show.jbuilder', locals: {:@job => @job})

如何直接从控制器渲染保存的 json?

为控制器中的动作代码添加这个

def show
   @job = Job.find(params[:id])    
   render :inline => @job.json_output 
end

【问题讨论】:

    标签: ruby-on-rails jbuilder


    【解决方案1】:

    render_to_string

    将模板原始呈现为字符串。

    和render类似,只是不设置response_body 并且应该保证总是返回一个字符串。

    此外,如果您是从控制器执行此操作,则可以使用控制器进行渲染:

    class JobsController
      def create
        @job = Job.new(item_params) do |job|
          job.my_json_attribute = render_to_string(:show, locals: { :@job => job})
        end
        if @job.save
          redirect_to @job
        else
          render :new
        end
      end
    end
    

    但这似乎是一种非常复杂且有缺陷的方法来处理可以使用e-tag caching 和反向代理甚至low level caching 完成的事情。特别是因为您在更新项目时必须重复逻辑。

    【讨论】:

    • 构建 json 需要 30 多秒。所以缓存没用,因为第一次加载太慢了。
    • 我能说什么。 jBuilder 以速度慢着称,如果需要 30 秒,您可能会有多个 n+1 查询和其他问题。
    • 它的数据量很大。它不是我们可以优化出来的东西,因此考虑在后台进程中预先构建它。
    • 但是,如果您向客户端发送大量 json,您仍然会遇到很大的问题,您需要考虑诸如分页之类的解决方案,否则客户端和您的基础架构都会受到影响。
    • 谢谢,但这也不合适。
    猜你喜欢
    • 1970-01-01
    • 2011-11-07
    • 2017-01-04
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多