LoginSignup
9
14

More than 3 years have passed since last update.

Railsで画像を表示する方法

Posted at

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に代入しておき、

hogehoge_controller.rb
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

9
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
14