Rails 6.0.0.rc1 を使用して API のみのバックエンドを構築しています。私の基本コントローラーは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
思いますが、私が言えることから、これら2つを混在させる方法はありません。
"修理":
# 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
か?