Подтвердить что ты не робот

Как я могу отобразить в строке представление JSON представления JBuilder?

Я использую JBuilder, чтобы вернуть некоторый JSON. У меня есть index.json.jbuilder, который генерирует данные, и мне нужно отобразить его в строке. Однако я не уверен, как это сделать, поскольку: @my_object.to_json и @my_object.as_json, похоже, не проходят через JBuilder.

Как я могу отобразить представление JBuilder в виде строки?

4b9b3361

Ответ 1

Я представляю коллекцию пользователей как строку json в контроллере, например:

#controllers/users_controller.rb
def index
  @users = User.all
  @users_json = render_to_string( template: 'users.json.jbuilder', locals: { users: @users})
end

#views/users/users.json.jbuilder
json.array!(users) do |json, user|
  json.(user, :id, :name)
end

Ответ 2

Если представление users.json.jbuilder находится по умолчанию по отношению к контроллеру и не может найти шаблон, это может быть связано с несоответствием format, поскольку оно может пытаться искать файл формата html, Есть два способа исправить это:

  • Попросите клиента GET /users/index.json

    или

  • Укажите formats при вызове render_to_string (также относится к render):


#controllers/users_controller.rb
def index
  @users = User.all
  @users_json = render_to_string( formats: 'json' ) # Yes formats is plural
end

Это подтверждено в Rails 4.1.

Ответ 3

Вы также можете сделать это так, чтобы ваш контроллер немного чище.

# 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>

Ответ 4

Если вы делаете это в контроллере, гораздо более простой вариант - попытаться переместить код в представление, отображаемое контроллером.

Я описал это здесь: https://github.com/shakacode/react-webpack-rails-tutorial/blob/master/docs/jbuilder.md

в основном вы можете вызвать render в представлении, и все готово. Как это:

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

Вот примечания о том, что происходит, если вы хотите передать данные из контроллера в представление:

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 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 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

Ответ 5

Посмотрев на исходный код, похоже, что вы можете сделать:

json_string = Jbuilder.encode do |json|
  json.partial! 'path/to/index', @my_object
end

Ответ 7

в контроллере вы можете сделать это

def index
  json = JbuilderTemplate.new(view_context) do |json|
    json.partial! 'index'
  end.attributes!
  do_something(json)
  render json: json
end

обратите внимание, что вам нужно "_index.json.jbuilder", потому что он вызывает частичный рендеринг

Ответ 8

Следуя совету Джастингордон.

Если вы используете компонент React, вы можете сделать следующее.

В вашем контроллере:

@users = User.all

По вашему мнению:

<%= react_component("YourComponentName",
                    props: render('your_template.json.jbuilder')) %>

Это было проверено на Rails 5.1.