プログラミングの学習を初めてこのかた、今までrefile
を使用した画像の投稿の仕方のみを実装してきたため、gemを使用しない画像ファイルの保存方法を知らずに来てしまった。
が、先日Railsのデフォルトの機能のみで画像ファイルを保存する方法を学んだので、備忘録として記載しておこうと思う。
ちなみにテーブルのカラムは以下の通り
postsテーブル
・title
・content
・image_name
1.publicフォルダ内に画像ファイルを格納するフォルダを作成
アップロードされた画像ファイルを格納するpost_imagesフォルダ
をpublicフォルダ
階層下に作成する。
アップロードされた画像ファイルはこのフォルダの中に"id.jpg"
という名前で保管されることとなる。
一覧画面や詳細画面で画像を表示する際は、"id.jpg"
の中身の記述を参照し、画像として読み込んで処理をする流れとなる。
つまり、データベースのカラムに保存されるのはあくまで"id.jpg"
という画像ファイルを示す名前であって、実際のファイルはこのpublic内に用意した場所で保管する必要がある。
2.controllerに処理を記述する
今回はparams
の中身が分かりやすいように、あえてストロングパラメータを使用しない書き方で説明していく。
:
def create
@post = Post.new
@post.title = params[:title]
@post.content = params[:content]
# image_nameカラムにid.jpgという値を代入
@post.image_name = "#{@post.id}.jpg"
# 変数imageにフォームから送信された値を代入
image = params[:image]
# File.binwriteで、public/post_imagesにファイルを作成
File.binwrite( "public/post_images/#{@post.image_name}", image.read )
@post.save
end
:
上記の処理内容を詳しく見ていく
1.image_nameカラムにid.jpg
という値を代入
@post.image_name = "#{@post.id}.jpg"
この名前でファイルを作成する為、アップロードされた画像はjpg形式
に変換されて保存される。
2.変数imageにアップロードされた画像ファイルを代入
image = params[:image]
ここで変数image
にフォームから送られてきた画像ファイルの中身を代入する。
3.public/post_imagesにファイルを作成
その前に軽く説明しておくと、Railsにはデフォルトで用意されているFileクラスというものが存在し、このクラスにwriteメソッドを使用することで、引数で指定した場所に、指定した記述内容のファイルを作成することができる。
# 基本形
File.write(ファイルの場所, ファイルの中身)
# 使用例
File.write("public/hello.text", "Hello")
↓
Hello
これを踏まえた上で以下の行の流れを解説すると以下の通りになる
File.binwrite("public/post_images/#{@post.image_name}", image.read)
#第一引数 #第二引数
・Fileクラス
に対し、binwriteメソッド
を使用(画像ファイルの場合はwriteではなくbinwriteでファイルを作成)
・第一引数で格納先に先ほど用意したpost_imagesフォルダ
を指定
・第二引数として渡す内容を読み込む為に、変数image
にreadメソッド
を使用して、変数の中身を参照
感想
結論から言ってこちらの方法に関してはあくまで流れを理解するという名目に留めておき、実際はgemを使うのが一番手取り早いように感じる。
記載内容に間違いがあった場合はご指摘頂けると嬉しいです。
ご連絡お待ちしております。