在仅Rails 6 API的应用程序中从JBuilder视图呈现ActiveStorage Blob

时间:2019-07-15 22:55:40

标签: ruby-on-rails ruby rails-api jbuilder

我正在使用Rails 6.0.0.rc1构建仅API的后端。我的基本控制器扩展了ApplicationController::API并呈现JBuilder视图。我的Post模型具有一个名为content的ActionText RTF属性。为了正确呈现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,这是不理想的。我希望有选择地包括完成这项工作所需的任何模块,但是我一直无法弄清楚这可能是哪个模块。我怀疑这可能是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时,有什么方法可以固定资产路径吗?

1 个答案:

答案 0 :(得分:0)

对不起,ActionController::API并非旨在呈现HTML,它也不呈现模板。此行不能肯定起作用:

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

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