Визуализация больших двоичных объектов ActiveStorage из представления JBuilder в приложении только для API Rails 6

Я создаю серверную часть только для API, используя Rails 6.0.0.rc1. Мой базовый контроллер расширяет ApplicationController::API и отображает представления JBuilder. Моя модель Post имеет атрибут расширенного текста ActionText с именем content. Чтобы правильно отобразить Post.content, мое представление JBuilder отображает частичный HTML. Это работает хорошо, за исключением того, что любые образы ActiveStorage получают неправильное доменное имя в своих URL-адресах (example.org).

# app/controllers/api/api_controller.rb

class Api::ApiController < ActionController::API
  include ActionView::Layouts
  layout 'api'

  before_action :set_default_response_format

  private

  def set_default_response_format
    request.format = :json
  end
end
# app/controllers/api/posts_controller.rb

class Api::PostsController < Api::ApiController
  def index
    @posts = Post.published
  end
end
# app/views/api/posts/index.json.jbuilder

json.posts @posts, partial: 'api/posts/post', as: :post
# app/views/api/posts/_post.json.jbuilder

json.extract! post,
              :id,
              :type,
              :slug,
              :path,
              :title,
              :excerpt

json.content render partial: 'api/posts/post-content.html.erb', locals: { post: post }
# app/views/api/posts/_post-content.html.erb

<%= post.content %>

Я пробовал различные методы изменения значения http_host по умолчанию для рендеринга, но ни один из них не сработал. Единственный способ решить эту проблему — изменить мой контроллер, чтобы он наследовал от ApplicationController::Base вместо API, что не идеально. Я бы предпочел выборочно включить модули, необходимые для работы, но я не смог выяснить, какие именно. Я подозреваю, что это может быть разница между Rendering и ApiRendering, но из того, что я могу сказать, смешивать эти два нельзя.

"Исправить":

# app/controllers/api/api_controller.rb

# We want to extend ActionController::API here
# but it's messing up the asset paths
class Api::ApiController < ActionController::Base
  # include ActionView::Layouts
  layout 'api'

  ...
end

Есть ли способ исправить пути к ресурсам при расширении ApplicationController::API?


person TWGerard    schedule 15.07.2019    source источник


Ответы (1)


Извините, но ActionController::API не предназначен для рендеринга HTML, он также не рендерит шаблоны. Эта строка точно не сработает:

json.content render partial: 'api/posts/post-content.html.erb', locals: { post: post }

Почему бы вам просто не поставить json.content вместо рендеринга шаблона?

person Pere Joan Martorell    schedule 15.08.2019