Преобразование обратно в обычный текст при использовании ActionText

Прежде всего позвольте мне сказать, что мне нравится то, что Rails 6 может предложить в ActionText. К сожалению, когда я объявляю это для атрибута в чем-то вроде модели поста:

class Post < ApplicationRecord
  has_rich_text :body
end

Я больше не могу получить доступ к тексту тела. Это становится экземпляром ActionText. Я полностью понимаю, как работает эта функциональность, но иногда мне нужно передать простой текст тела другим внешним методам. В моем случае я использую тело в своих тегах мета-описания с гемом, называемым мета-тегами. Это приводит к этой ошибке:

Expected a string or an object that implements #to_str

Это потому, что то, что было до того, как простой текстовый столбец стал экземпляром AT:

=> #<ActionText::RichText id: 39, name: "body", body: #<ActionText::Content "<div class=\"trix-conte...">, record_type: "Post", record_id: 161, created_at: "2019-08-17 17:34:27", updated_at: "2019-08-17 17:34:27"> 

Видя, что к нему привязаны методы получения, я попытался сделать что-то вроде @post.body.body но это на самом деле

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

Также обратите внимание, что я пытался создать метод внутри модели post, но после объявления has_rich_text у меня больше нет первоначального доступа к тексту моего тела.

Я не совсем уверен, как:

  • Извлеките исходное содержимое из атрибута body. Преобразуйте его в обычный текст без HTML.

3 ответа

Решение

Таким образом, очевидно, что экземпляры ActionText имеют метод для получения значений простого текста с to_plain_text, Все вместе это выглядит так:

@post.body => <div>This is my markup</div>
@post.body.to_plain_text => This is my markup

Да, ответ Карла правильный

      @post.body.to_plain_text #=> This is my markup without image

Однако, если у вас есть какие-либо вложения (например, изображение большого двоичного объекта) внутри вашего текста действия, они будут отображаться как

      @post.body.to_plain_text #=> This is my markup with image[PXL_20210808_152511813.jpeg] 

Это связано с этим кодом , который вызывается для каждого вложения, когда#to_plain_textэто называется

Если вы находитесь в случае, когда вы не хотите отображать текст для вложений больших двоичных объектов, вам необходимо перезаписатьActiveStorage::Blob#attachable_plain_text_representation

Один из способов сделать это:

      # config/initializers/active_storage_overrides.rb

module ActiveStorageBlobOverrides
  def attachable_plain_text_representation(caption = nil)
    ""
  end
end

Rails.configuration.to_prepare do
  ActiveStorage::Blob.send :prepend, ::ActiveStorageBlobOverrides
end

Как вы закончите с:

      @post.body.to_plain_text #=> This is my markup with image 

Надеюсь, это сэкономит вам пару часов отладки.

Поверх to_plain_text мы можем вызвать squish, чтобы удалить новую строку '\n'

Другие вопросы по тегам