【问题标题】:Capture json.builder data in a variable在变量中捕获 json.builder 数据
【发布时间】:2021-04-10 05:31:31
【问题描述】:

我在控制器文件中有一个函数,我们在函数末尾呈现响应,如下所示:

render_response(template: 'index')

render_response 是一个单独的帮助文件中的自定义函数,定义如下:

def render_response(options = {})
  options[:status] = build_status_code(options)
  response_json = {
    success: success_status(options[:status]),
    code: options[:status],
    data: build_data(options),
  }
  render json: response_json, status: options[:status]
end

另外,还有一个文件 index.json.builder 包含这样的内容:

hash = { author: { name: "David" } }
json.post do
  json.title "Merge HOWTO"
  json.merge! hash
end 

我想在控制器文件中的一个变量(比如说json_data)中捕获来自index.json.builder 的整个JSON。但是,我无法找到它的语法或方法。
任何线索将不胜感激。

【问题讨论】:

    标签: ruby-on-rails ruby jsonbuilder


    【解决方案1】:

    您可以尝试使用 JBuilder 测试中的逻辑 https://github.com/rails/jbuilder/blob/master/test/jbuilder_template_test.rb#L287-L311 我能够让它在我的控制器/控制台中工作

    def build_view(options = {})
        
        lookup_context = ActionView::LookupContext.new([ "app/views/homes/" ], {}, [""]) # REPLACE HERE YOUR VIEW OR PARTIAL DIRECTORY PATH
        controller = self
    
        view = if ActionView::Base.respond_to?(:with_empty_template_cache)
        ActionView::Base.with_empty_template_cache.new(lookup_context, options.fetch(:assigns, {}), controller)
        else
        ActionView::Base.new(lookup_context, options.fetch(:assigns, {}), controller)
        end
    
        def view.view_cache_dependencies; []; end
    
        view
    end
    
    result = build_view.render(partial: "show") # name of your partial or view
    => :build_view
      Rendered homes/_show.json.jbuilder (Duration: 0.6ms | Allocations: 174)
    => "{\"post\":{\"title\":\"Merge HOWTO\",\"author\":{\"name\":\"David\"}}}"
    
    

    我不建议将视图中的数据渲染回控制器,这不是一个非常简单和轻松的过程,至少可以说(考虑到您的 rails 应用程序的全部目的是让您的应用程序将数据转换为视图,然后进入您的浏览器,这与您的要求相反)

    我确实认为这里更好的方法是将 JSON 构建拉入类或模型或方法中,然后在控制器和视图中使用该方法

    
    def the_json_data_you_want
      hash = { author: { name: "David" } }
      Jbuilder.new do |json|
        json.post do
          json.title "Merge HOWTO"
          json.merge! hash
        end
      end
    end
    

    要检索 JSON,您可以调用 the_json_data_you_want.target!

    irb(main):7:0> the_json_data_you_want.target!
    => "{\"post\":{\"title\":\"Merge HOWTO\",\"author\":{\"name\":\"David\"}}}"
    

    然后你可以在你的控制器中使用它并将它传递给它将被渲染的视图

    这里有更多文档https://github.com/rails/jbuilder

    【讨论】:

      猜你喜欢
      • 2011-09-15
      • 2018-05-18
      • 2021-11-29
      • 1970-01-01
      • 2013-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多