はじめに
carrierwaveで投稿に添付ファイルをアップロードする機能を作成しました。
その機能では、ローカル環境に保存するためセキュリティの問題でファイルを保存するときにランダムなファイル名に変更されるようにしております。
しかし、画面にファイル名を表示する時は元々のオリジナルのファイル名を表示する必要がでてきたので、今回はこの問題を対応した。
carrierwaveでのファイルの投稿機能自体については省略します。
環境
ruby 3.1.2p20
Rails 7.0.4
変更前のテーブル
Posts |
---|
title |
text |
attachment_file |
実際に対応したこと
Postsテーブルにoriginal_file_nameカラムを追加して、attachment_fileを保存する前ににファイルのオリジナルのファイル名をoriginal_file_nameに保存する処理を追加しました。
original_file_nameカラムを追加します
db/migrate/20240101XXXXXX_add_column_posts.rb
class AddOriginalFileNameToPosts < ActiveRecord::Migration[7.0]
def up
add_column :posts, :original_file_name, :string
end
def down
remove_column :posts, :original_file_name
end
end
$ railis db:migrate
変更後のテーブル構造
Posts |
---|
title |
text |
attachment_file |
original_file_name |
オリジナルのファイル名を保存するメソッドをuploader.rbに作成します。
app/uploaders/post_detail_file_uploader.rb
# 元々のファイル名をsetする
def set_original_file_name
model.original_file_name = file.original_filename if file.present?
end
file.original_filename
でファイル名を取得できます。
それで取得したファイル名を
model.original_file_name
に代入するだけの凄くシンプルなコード
作成したメソッドをbefore_saveを使用してpost.rbでモデルが保存される前に実行するように設定します。
app/models/post.rb
before_save :set_original_file_name
def set_original_file_name
detail_file.set_original_file_name if detail_file.present?
end
これで元々のファイル名をカラムに保存できるので、元々のファイル名で扱いたい時はこのカラムを呼び出すことで対応できるようになりました。