Rails – 掲示板 – プロフィール画像アップロード機能

概要

ユーザー設定の枠組みコメント編集機能を実装した。

ファイルアップロードの実装の詳細は「画像アップロード」にまとめており、ここでは以下の仕様のコードと説明のみまとめる。

  • ユーザー設定画面に以下を表示
    • 現在のプロフィール画像
    • ファイル選択要素
    • コメント入力要素(現在のコメント内容を入れておく)
  • 送信時に画像が選択されていれば画像ファイルを保存してファイル名をデータベースに登録
    • 画像保存前に 今の画像ファイルを削除
    • 画像ファイル名はランダム文字列で与える
  • コメント入力は入力されているテキストで更新
  • 更新に成功すればプロフィール画面に遷移
  • 更新に失敗すれば再度ユーザー設定画面に遷移

掲示板の第2段階へ

画像ファイル保存場所

publicディレクトリー下にuser_imagesディレクトリーを作成。ここにプロフィール画像を保存。

users#editアクション

プロフィールコメント編集と同じ。

ルーティング

プロフィールコメント編集と同じ。

edit.html.erbビュー

画像アップロードに関する表示要素は以下のとおり。

  • 現在のプロフィール画像(L6~12)
  • プロフィール画像選択フィールド(L13)

app/views/users/edit.html.erb

イメージファイルをdivで囲んでいる(L6~12)。スタイル設定でdiv要素のサイズに合わせて画像をフィッティング・センタリング

file_fieldのパラメーターキー:upload_fileはモデルのパラメーターには含まれない(L13)。コントローラーでファイルオブジェクトを取り出すためだけに使われる。

ボタンが押されると、update_user_pathupdateコントローラーに制御が移る(L4)。

user_image_urlヘルパー

editビューでプロフィール画像を表示するのにuser_image_urlヘルパーを使っている。このヘルパーはUserに関して使うので、UsersHelperモジュールに書いている。

画像ファイルのパスについては画像ファイルの配置とパス指定を参照

users#updateアクション

次の機能を追加している。

  • フォームからのアップロードファイルの取得
  • ファイルの保存
  • データベースへのファイル名の登録

app/controllers/users_controller.rb

パラメーターからアップロードファイルのオブジェクトを取得(L6)。

user_paramsで得られたパラメーターをnew_user_paramsに保存しているが、ファイルが存在する場合はこれに:image_file_nameがマージが追加される。

ファイルタイプはJPEGかPINGのみで、それ以外はエラーをフラッシュして再度設定画面を表示(L11~20)。

ファイル名の衝突を避けるため、ファイル名をランダム文字列としている(L22)。

現在存在しているファイルを削除する(L27~33)。

ランダム文字列の生成

ランダム文字列の生成は記事投稿にも使うため、application_helper.rbに書く。

app/helpers/application_helper.rb

これを有効にするにはインクルードしておく必要がある。

app/controllers/application_controller.rb

user_paramsヘルパー

プロフィールコメント編集と同じ。

params[:user][:update_file]は直接保存しないため、ストロングパラメーターとする必要がない。

スタイル

プロフィール画像のフィッティングとセンタリング(L20~33)。

L34ではファイル入力要素のスタイルを設定。

app/assets/stylesheets/users.scss

フラッシュの追加

application.html.erbフラッシュの表示を追加(application_signed_out.html.erbと同じ内容)。

  • jQueryの読み込み
  • フラッシュ表示部
  • 一定時間後のスライドアップ

app/views/layouts/application.html.erb

プロフィール画面の変更

プロフィール画像ファイルのアップロードができたので、プロフィール画面にこれを表示させるよう変更する。

  • プロフィール画面が未登録の場合はダミー画像を表示する
  • 画像が存在する場合はuser_image_urlヘルパーで画像のフルパスを取得する

app/views/users/show.html.erb

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です