Преобразование обратно в обычный текст при использовании 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'