Progateの第7章でやったことのメモです。
画像ファイルは/app/assets/images 下に置き,image_tag ヘルパーで読み込むのがいいとほかの方に教わりましたが、とりあえずは/public直下に画像ファイルを置きました...
#Railsで画像を表示する大まかな流れ
1.画像名を保存するカラムをデータベースに作る
2.form_tagで画像を送れるようにする
3.一つのアクションでデータベースに画像ファイル名の保存、/public内に画像ファイルの作成
4.画像ファイル名をデータベースから指定して表示
##1.画像名を保存するカラムをデータベースに作成
マイグレーションファイルのみを作成し、その内容をデータベースに反映させます。
まずはマイグレーションファイルのみの作成から。
###マイグレーションファイルの作成方法
$rails g model
コマンドを使うとマイグレーションファイルのみならずモデルまで生成されてしまうので、
$rails g migration ファイル名
を使う。ファイル名は何をするファイルなのかわかりやすくすると良い。
###migrationファイルの反映方法
migrationファイルの中のchangeメソッドの中にコードを書いていく訳だが、例えばusersテーブルにimage_nameカラムを追加し、データ型をstringにしたい場合は
add_column :users, :image_name, :string
と記述します。
そして$rails db:migrate
でデータベースに変更を反映
##2.form_tagで画像を送れるようにする
<input type="file>
とすると画像ファイルを選択できるようになります。
そして画像ファイルを送る場合は、
<%= form_tag("...",{multipart: true}) do %>
とします。
##3.一つのアクションでデータベースに画像ファイル名の保存、/public内に画像ファイルの作成
画像ファイル名の保存は普通に@user.image_nameに代入すれば良い
画像ファイルの保存だが、そもそも画像ファイルとはコンピュータ用の文字で書かれたテキストファイルと同じような普通のファイルらしい?
なので送信された画像ファイルを/public内に書き込めば良い。
###Rubyでのファイルの書きこみかた
Rubyにもともと用意されているFileクラスを用いてファイルを扱う
ファイル作成にはFileクラスのwriteメソッドを使う
public/内にHelle.txtというファイルを作成し、中身を"Hello World!"とする場合、
File.write("public/Hello.txt", "Hello World!")
と記述する
####次に実際に画像ファイルを保存していく。
<input name="image_file" type="file">
で送信された画像ファイルの情報は他と同様に、
params[:image_file]
で受け取れる。
そしてimage=params[image_file]
としてimageに代入しておき、
def hogehoge
@user.image_name="#{@user.id}.jpg"
image=params[:image_file]
File.binwrite("public/#{@user.image_name}", image.read)
end
と記述し、画像ファイルを作成する
※画像データは特殊なため、binwriteを使用。また、readメソッドを使うことにより画像データを取得している
#4.画像ファイル名をデータベースから指定して表示
あとはいつも通り
<img src="<%= "#{@user.image_name}" %>">
で表示すればOK