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

后端 未结 8 1535
抹茶落季
抹茶落季 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
    

提交回复
热议问题