ruby-on-rails - Rails 6 - 动作文本和 API
问题描述
我正在创建一个 Rails 6.0.0 应用程序,它具有以下模块:
- 网络 - 表格 / Cruds
- api
在我使用Action Text的地方有一个 CRUD 。表单工作正常,我成功实现了动作文本工件。
接下来,我创建了一个 JSON API,它公开了通过表单创建的资源。输出 JSON 如下所示:
{
"id": 3,
"title": "Happy title",
"content": {
"id": 1,
"name": "content",
"body": "<div>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas eget tortor venenatis elit laoreet sagittis. In hac habitasse platea dictumst. Mauris nec nisl dapibus sem volutpat ultricies vel eu erat. Nunc at aliquet diam, vel pretium velit. <br><br><action-text-attachment sgid=\"BAh7CEkiCGdpZAY6BkVUSSI0Z2lkOi8vZXhpbi13ZWIvQWN0aXZlU3RvcmFnZTo6QmxvYi81P2V4cGlyZXNfaW4GOwBUSSIMcHVycG9zZQY7AFRJIg9hdHRhY2hhYmxlBjsAVEkiD2V4cGlyZXNfYXQGOwBUMA==--8f909146395a3dede0d4d5e47ad54d82d9e06367\" content-type=\"image/png\" url=\"http://localhost:3000/rails/active_storage/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBDZz09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--6a79e95fd7a0fc0883190bd1201d4f5ecb1f8445/qrcode%20(2).png\" filename=\"qrcode (2).png\" filesize=\"497\" width=\"400\" height=\"400\" presentation=\"gallery\"></action-text-attachment><br><br><strong>Phasellus</strong> at dictum ligula. Sed tempus odio sed elit ultricies, in pulvinar purus dictum. Suspendisse sit amet fermentum lacus. Suspendisse sed tristique lectus.</div>",
"record_type": "Announcement",
"record_id": 3,
"created_at": "2019-10-30T23:25:24.080Z",
"updated_at": "2019-10-30T23:25:24.138Z"
},
"created_at": "2019-10-30T23:25:24.039Z",
"updated_at": "2019-10-30T23:25:24.139Z"
}
问题:
如果您看到, content.body 属性具有 Rails 操作文本标签:
<action-text-attachment sgid...>
在一天结束时的表单中,Rails Action Text 将此标记转换为图形 HTML 标记,如下所示,以呈现图像:
<figure class="attachment attachment--preview attachment--png">
<img src="http://localhost:3000/rails/active_storage/representations/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBDZz09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--6a79e95fd7a0fc0883190bd1201d4f5ecb1f8445/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdCam9VY21WemFYcGxYM1J2WDJ4cGJXbDBXd2RwQWdBRWFRSUFBdz09IiwiZXhwIjpudWxsLCJwdXIiOiJ2YXJpYXRpb24ifX0=--defcd74f258f74bba5b028de265f7a5858cffd0b/qrcode%20(2).png">
<figcaption class="attachment__caption">
<span class="attachment__name">qrcode (2).png</span>
<!--<span class="attachment__size"></span>-->
</figcaption>
</figure>
问题:
如何使用 JSON API 呈现相同的 HTML?
我需要公开此内容以便在多个客户端应用程序中呈现它。
解决方案
所以我创建了一个虚拟列,before_save
用 Action Text 的原始输出填充模型的回调。
has_rich_text :rich_body
before_save :update_old_body
private
def update_old_body
self.body = rich_body&.body&.to_s unless body
end
然后我放入body
我的序列化程序来生成 JSON。
但是,如果您想迁移旧记录,则必须手动创建操作文本记录,否则您将得到非常持久的undefined method 'render_action_text_content'
错误。在我的情况下,将回调更改为此:
def update_old_body
self.body = rich_body&.body&.to_s unless body
rescue ActionView::Template::Error
build_rich_text_rich_body
end
完毕。
更新
如果您有附件,则需要将其更改为:
self.body = rich_body&.body&.to_rendered_html_with_layout
拯救自己一个受伤的世界。
推荐阅读
- php - php api响应未显示所有结果
- javascript - React : TypeError: _this4 is undefined react
- css - 如何在背景图像上应用两个滤镜?
- c# - 如何根据 ComboBox 中选择的项目将 TextBox 设为只读?
- android - 活动可见,但调试器未通过设置断点 onCreate()
- r - 更改 knitr::kable 标头的背景颜色
- windows - Jenkins 加载外部 groovy 脚本:powershell 和 bat 步骤挂起
- c - C - 莫尔斯电码程序中的字符串分段错误
- php - 引导字体的 Yii2 BaseUrl
- python - 在python中求解线性方程