\ プログラミング学習奮闘記録 /

Progate学習メモ Ruby on Rails5【SNSを作る⑤〜ユーザー画像を表示する〜】

目次

ユーザー画像を表示する仕組み

ファイル名を保存しておき、そのファイル名の画像を表示する。

→ファイル名を保存するために、usersテーブルにimage_nameカラムを用意する!

 ※画像ファイルは、publicフォルダ内に保存する

ファイル名を表示するカラムを追加する

STEP
マイグレーションファイル【のみ】を作成する

マイグレーションファイルのみを作成するには、「rails g migration ファイル名」とする。

《ターミナル》

$ rails g migration add_image_name_to_users

          ファイル名

  • 指定したファイル名のマイグレーションファイルが作成される
  • ファイル名は自由に指定できますが、追加するカラム名を含めるなど分かりやすい名前が良い
  • ファイル名には先頭にファイルの作成日時が自動的に追加される
STEP
マイグレーションファイルの内容をデータベースに反映する

テーブルに変更を加えるためには、生成されたマイグレーションファイルの中の
changeメソッドの中に変更内容を書く必要がある。

今まで扱ってきた「rails db:migrate」コマンドはこのchangeメソッドの中身を実行するためのコマンドで、

「rails g model」コマンドではchangeメソッドの中身が自動生成されていた。

カラムを追加する場合には、
add_column :テーブル名, :カラム名, :データ型」とする。

changeメソッドの中身を追加したら、「rails db:migrate」でデータベースに変更を反映する

《ミグレーションファイル》

class AddImageNameToUsers < ActiveRecord::Migration[5.0]
def change
add_colmun :users, :image_name, :string
end
end

初期画像を設定する

ユーザー登録時に、image_nameカラムの値が「default_user.jpg」になるようにする。

createアクション内の@userを定義しているところで、newメソッドの引数としてimage_nameを追加する。

《コントローラ》

def create
@user = User.new(
name: params[:name],
email: params[:email],
image_name: “default_user.jpg”
)

ユーザー画像を表示する

詳細ページに画像を表示する

ユーザー画像を表示するためには、今まで画像を表示してきた時と同様に、HTMLの<img>タグを使う。

《ビュー》

<img src=”<%= “/user_images/#{@user.image_name}” %>“>

  • 画像はpublic/user_imagesフォルダに保存されているのでsrc属性の値を「/user_images/ファイル名」とする必要がある
  • /から始まるので注意
  • Rubyのコード部分は<%= %>で囲む必要がある

一覧ページに画像を表示する

一覧画面にユーザー画像を表示するためには、each文を利用します。@usersに代入されている配列のデータをeach文で1つずつ変数userに代入し、ユーザー画像を繰り返し表示させる。

《ビュー》

<% @users.each do |user| %>

<img src=”<%= “/user_images/#{user.image_name}” %>“>

<% end %>

ユーザーごとに画像を編集できるようにする

画像選択ボタン

<input>タグに「type=”file”」を追加することで、画像ファイルを選択するボタンを表示することが出来る。

《ビュー》

<h2>画像</h2>

<input name=”image” type=”file”>

  • name属性を指定するのを忘れない!

画像の送信 multipart : true

画僧の送信は特殊なので、form_tagに{multipart: true}を追加する必要がある。

《editビュー》

<% form_tag(“…”/{multipart: true}) do %>

【例】

<%= form_tag(“/users/#{@user.id}/update”,{multipart: true}) do %>

  • form_tagの時、doを忘れがちなので注意

ファイルを作成する

update アクションで、ファイル名をデータベースに保存し、 public フォルダに画像ファイルを作成していく

Rubyのコードでファイルを作成する Fileクラス

ファイルを作成するためには、Fileクラスのwriteメソッドを使う

《ターミナル》

File.write(“public/sample.txt”,“Hello world”)

     ファイルの場所   ファイルの中身

  • File.writeの時には、「public」を指定していることに注

送信された画像を保存する

updateアクションに以下の機能をつける

  • ファイル名をデータベースに保存する
  • publicフォルダ内に画像を作成する

ファイル名をデータベースに保存する

nameやemailを更新した時と同じように、@user.image_nameの値を上書きする。

《createアクション内》

@user.image_name = “#{@user.id}.jpg”

  • ファイル名は上記のように、「ユーザーのid.jpg」となるようにする
  • ドットを忘れないように注意!

画像を受け取る(publicフォルダ内に画像を保存する方法)

画像ファイルも他のnameやemailと同様に、params[:image]とすることで受け取ることができる。

《createアクション内》

image = params[:image]

  • params[:image]の中には、<input name=”image”>から送信された画像ファイルに関する情報が入っている。
  • ここで受け取る画像ファイルを利用して、publicフォルダ内に画像を作成する

画像を保存する File.binwriteメソッド

《createアクション内》

@user.image_name = “#{@user.id}jpg”

image = params[:image]

File.binwrite(“public/user_images/#{@user.image_name}”,image.read)

         ファイルの場所         ファイルの中身(画像データ)

  • File.writeではなくFile.binwriteを用いる
  • 変数imageに対し、readメソッドを用いることでその画像データを取得できる

画像が存在するか判定する

画像を保存する処理は、画像データが送信された場合だけ実行する。if文で処理を分岐させる

《createアクション内》

if params[:image]  ← 画像が保存されているかどうか判定する

 @user.image_name = “#{@user.id}.jpg” ←保存されてたら、ファイル名を保存して、

 image = params[:image]       ← 画像データを受け取って

 File.binwrite(“public/user_images/#{@user.image_name}”,image.read) ← 画像を保存する

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次