1

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

4

1 に答える 1