首页 > 解决方案 > Rails 6 - 动作文本和 API

问题描述

我正在创建一个 Rails 6.0.0 应用程序,它具有以下模块:

在我使用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?

我需要公开此内容以便在多个客户端应用程序中呈现它。

标签: ruby-on-railsruby-on-rails-6actiontext

解决方案


所以我创建了一个虚拟列,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

拯救自己一个受伤的世界。


推荐阅读