Я создаю серверную часть только для 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
?