Rails 6 - 动作文本 & API

Rails 6 - Action Text & API

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

我使用 Action Text 的地方有一个 CRUD。表单运行正常,我成功实现了 Action Text 工件。

接下来,我创建了一个 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 操作文本将此标签转换为图形 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?

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

假设我有 has_rich_text :description。为了获得纯 body 我需要用 description.body.to_s 调用它,因为它给我:

"<div class=\"trix-content\">\n  <div>test</div>\n</div>\n"

无论多么简单 description.body 都会给我:

#<ActionText::Content "<div class=\"trix-conte...">

所以我创建了一个虚拟列,以使用 Action Text 的原始输出填充模型的 before_save 回调。

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

让自己远离受伤的世界。