ruby-on-rails - 在仅 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
,这并不理想。我更愿意选择性地包含完成这项工作所需的任何模块,但我无法弄清楚这可能是哪些模块。我怀疑这可能是 和 之间的区别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
?
解决方案
对不起,但ActionController::API
不是为了呈现 HTML,它也不呈现模板。这条线肯定不会起作用:
json.content render partial: 'api/posts/post-content.html.erb', locals: { post: post }
为什么不直接放置json.content
而不是渲染模板?
推荐阅读
- javascript - 为什么我在网站上上传时我的 jQuery 不起作用
- javascript - 在 pentaho 或 Javascript 中每行添加 2 分钟
- sql - 如何创建具有对象类型的表?
- web-scraping - 如何阻止爬虫
- dns - 如何在浏览器中不显示目标 URL 的情况下将域转发到 Cloudfront URL?
- python - 循环访问 API json 响应并将它们添加到一个 python 字典中
- python - 我将如何遍历数据框并创建一个将列名存储为键并将相应的行索引存储为值的字典?
- react-redux - redux test Actions 必须是普通对象。使用自定义中间件进行异步操作
- php - CodeIgniter 3 密码重置邮件功能
- python - 如何在条件语句中的 for 循环迭代器上使用比较语句?