どうも、たくチャレ(@takuchalle)です。

Ruby on Rails その2 Advent Calendar 2018 の 3日目です。

2日目の記事は、donchan922 さんの Ruby on Railsで簡単なToDoアプリを作ってみる でした!

僕がその2を立てたけどあまり埋まってないので、自分で投稿していくスタイルです。今回は軽い小ネタです。

みなさんご存知の通り、Rails のバージョン5.2 からActiveRecordが追加されました。 ファイルストレージを操作するためのもので、サードパーティーでは Carrierwave などの gem があります。

せっかくバージョン 5.2 を使ってるからActiveRecordを使いたいんですが、なかなか僕が思ってるような使い方ができず困っていました。

やりたいこと

サーバ内で生成したファイルをストレージに保存したいということです。

ブラウザのフォームからアップロードされたファイルをモデルに紐づけてそのままActiveRecord経由でストレージに置く方法を書いた記事は腐るほどあったのですが、POSTとは別のタイミングでActiveStorageに登録する方法が見つかりませんでした。

やりかた

環境

  • Ruby 2.5.1
  • Rails 5.2.1

公式のリファレンスに書いてありました。

attach(io: filename: content_type: )を使えばよさそうです。

@postのクラスにhas_one_attached :textがあると想定して、以下のコードでストレージに保存することができました。

Tempfile.create(["hogehoge", '.txt'], :encoding => 'utf8') do | file |
	file.write("hogehoge")
	file.rewind
	@post.text.attach(io: file, filename: "data_#{@post.id}.txt", content_type: "")
end

rewindがないとエラーが出ます。 fileのポインタがファイルの末尾にあるから、先頭に戻してあげる必要があるからです。

まとめ

Rails の ActiveStorage に TempFile で作ったファイルをアップロードする方法を紹介しました。

これをやるにあたり、TempFileの公式リファレンスがどこにあるか分からなかったですね…これは古そうだし… さっきのActiveStorageのリファレンスもググってもすぐでてこなかったし、Ruby 周りはリファレンスを探しにくい…?日本語の情報は出てくるんだけど、1次ソースを見たい時あるじゃないですか…

愚痴も交じりの小ネタでしたが、ググってもなかなか出てこなかった情報なのでメモとして残しておきます。

Ruby on Rails その2 Advent Calendar 2018 の 4日目は未定です。

同じカテゴリの記事