How could I render to a string a JSON representation of a JBuilder view?

后端 未结 8 1458
抹茶落季
抹茶落季 2020-12-29 05:18

I\'m using JBuilder as to return some JSON. I have a index.json.jbuilder that generates the data, and I need to render it to a string. However, I\'m not sure ho

相关标签:
8条回答
  • 2020-12-29 05:51

    If you're doing this in the controller, a much simpler option is to try to the move the code into the view being rendered by the controller.

    I described this here: https://github.com/shakacode/react-webpack-rails-tutorial/blob/master/docs/jbuilder.md

    basically you can call render in the view, and you're done. Like this:

    <%= react_component('App', render(template: "/comments/index.json.jbuilder"),
        generator_function: true, prerender: true) %>
    

    Here's the notes on what happens if you want to pass the data from the controller to the view:

    class PagesController < ApplicationController
      def index
        @comments = Comment.all
    
        # NOTE: The below notes apply if you want to set the value of the props in the controller, as
        # compared to he view. However, it's more convenient to use Jbuilder from the view. See
        # app/views/pages/index.html.erb:20
        #
        #  <%= react_component('App', render(template: "/comments/index.json.jbuilder"),
        #     generator_function: true, prerender: true) %>
        #
        #
        # NOTE: this could be an alternate syntax if you wanted to pass comments as a variable to a partial
        # @comments_json_sting = render_to_string(partial: "/comments/comments.json.jbuilder",
        #                                         locals: { comments: Comment.all }, format: :json)
        # NOTE: @comments is used by the render_to_string call
        # @comments_json_string = render_to_string("/comments/index.json.jbuilder")
        # NOTE: It's CRITICAL to call respond_to after calling render_to_string, or else Rails will
        # not render the HTML version of the index page properly. (not a problem if you do this in the view)
        # respond_to do |format|
        #   format.html
        # end
      end
    end
    
    0 讨论(0)
  • 2020-12-29 05:52

    You can also do it like this, which leaves your controller a bit cleaner.

    # controller
    def new
      @data = Data.all
    end
    
    
    # view
    <% content_for :head do %>
      <script type="text/javascript">
        var mydata = <%= raw render :partial => 'path/to/partial', :locals => {data: @data} %>;
      </script>
    <% end %>
    
    
    # path/to/_partial.html.jbuilder
    json.array!(@data) do |d|
      json.extract! field1, :field2, :field3, :field4
      json.url data_url(d, format: :json)
    end
    
    
    # layouts/application.html
    <!DOCTYPE html>
    <html>
    <head>
      <%= yield :head %>
    </head>
    <body>
    ...
    </body>
    </html>
    
    0 讨论(0)
提交回复
热议问题