首页 > 解决方案 > 在仅 Rails 6 API 的应用程序中从 JBuilder 视图呈现 ActiveStorage blob

问题描述

我正在使用 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 值的方法,但都没有奏效。我可以解决此问题的唯一方法是将我的控制器更改为继承 fromApplicationController::Base而不是API,这并不理想。我更愿意选择性地包含完成这项工作所需的任何模块,但我无法弄清楚这可能是哪些模块。我怀疑这可能是 和 之间的区别RenderingApiRendering但据我所知,没有办法将这两者混合在一起。

“使固定”:

# 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

标签: ruby-on-railsrubyrails-apijbuilderruby-on-rails-6

解决方案


对不起,但ActionController::API不是为了呈现 HTML,它也不呈现模板。这条线肯定不会起作用:

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

为什么不直接放置json.content而不是渲染模板?


推荐阅读