rake posts:remap の実行結果:リマップされた投稿は0件です!

フォラムのDiscourseへの移行後に残った壊れた画像を検索して置換しようとしています。remapコマンドは非常に成功していますが、以下の例では置換対象が見つからず、どこがおかしいのかわかりません。何か問題がありますか?

例のコンテンツ:

<img src="https://londonbikers.com/images/transparent.png" alt="PICT0738.JPG" data-orig-src="upload://1yz82u6bbkaAQ7xP06qNTmX9qy3.JPG" width="666" height="500" class="d-lazyload">

および

<img src="https://londonbikers.com/images/transparent.png" alt="Rhonda.JPG" data-orig-src="upload://vXQ67D17QssTe5cu6lamJ5XB5Ep.JPG" width="590" height="500" class="d-lazyload">

altタグの内容を保持し、その周りにimg要素を再構築する必要があるため、この作業は2回に分けて行う必要があります。最初のremapで失敗しています:

つまり、FIND:
<img src="https://londonbikers.com/images/transparent.png" alt="

をREPLACE:
<img src="https://londonbikersarchive.blob.core.windows.net/forum-attachments/

に置き換えます。

ダブルクォートはバックスラッシュでエスケープする必要があると仮定して、以下のコマンドを使用しました:

rake posts:remap["<img src=\"https://londonbikers.com/images/transparent.png\" alt=\"","<img src=\"https://londonbikersarchive.blob.core.windows.net/forum-attachments/"]

しかし、0 posts remapped! と表示されますが、そのような要素を含む投稿は数千件あります。何かアイデアはありますか?

2回目のパスでは、タグの末尾を以下から:
width="666" height="500" class="d-lazyload">

以下へ置換する予定です:
/>

おっと、いくつかの画像は表示されているようです。これは Discourse の添付機能でしょうか?データベースに HTML 文字列として保存されているのではなく、何かカスタムレンダリングロジックが働いているのでしょうか?

例えば、これは写真が表示されています:

<img src="https://londonbikers.com/uploads/default/original/1X/25b381a9dc03f023a1c5d0af4f2f3132dfbf45c7.jpg" alt="The_rides_0010.jpg" width="640" height="480" class="d-lazyload">

しかし、こちらは表示されません。ファイルをクラウドのブロブストレージに保持しているため、Discourse 内にインポートするか、ブロブストレージから参照するかのどちらかを希望しています:

<img src="https://londonbikers.com/images/transparent.png" alt="__2.jpg" data-orig-src="upload://411oUp2Yn6wumJCRAiFptkwTF58.jpg" width="662" height="500" class="d-lazyload">

それらの画像は raw に入っていますか?

remap で処理するよりも、Rails コンソールで Ruby を使う方がよいでしょう。

その内容、ぜんぜんわからなかったよ、ジェイ :slight_smile:

生データ、つまりファイル形式のこと?いや、普通のウェブ形式だよ。rails コンソールで何をしてるの?

raw は、エディタに表示されているテキストが格納されているフィールドです。あなたが置換しようとしているのは、UX で投稿を編集した際に表示される内容ですよね?(cooked は処理済みのデータで、実際に表示されるものです。)

投稿の書き換え処理を行っています。これだけであなたが危険な存在になってしまうかもしれませんね:

bps = Post.where("raw like '%//SOME-STRING%'")
bps.each do |post|
  post.raw.gsub!(/OLD/,'NEW')
  post.save
end

rake タスクを使う利点は、複数のエスケープレベルを navigater する必要がないことです。