Rails 6-动作文字和API

时间:2019-10-31 02:03:18

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

我正在创建一个Rails 6.0.0 App,它具有以下模块:

  • 网络-表单/粗体
  • Api

我使用Action Text时有一个CRUD。表单工作正常,我成功实现了Action Text构件。

向前,我创建了一个JSON API,该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标记:

<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?

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

2 个答案:

答案 0 :(得分:2)

因此,我创建了一个虚拟列,以使用动作文本的原始输出填充模型的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

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

答案 1 :(得分:0)

假设我有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...">