やりたいこと
railsでプロフィール画像など画像を投稿、DBに保存したい時のやり方。
仕様書
- image_nameカラムをユーザーのtableに用意
- デフォルトの画像を設定し、もし専用の画像がDBにあったら代入するようにする。
- public内に専用フォルダを作成し、そこに画像データを格納、画像の名前をDBに格納
- そこからURLで引っ張る
- updateアクションを作成し、画像を編集できるようにする
image_nameカラムの作成
rails g migration ファイル名
でマイグレーションファイルを作成。
マイグレーションファイルのchangeメソッドに
def change
add_column :テーブル名, :カラム名, :データ型
end
でその後rails db:migrationで反映。
デフォルト画像の設定
デフォルト画像の格納
users_controller.rb
def create
@user = User.new(
name:params[:name]
email:params[:email]
image_name:"default_user.jpg"
)
end
上記で記述し、画像が入ってなかったらデフォルトのものがでるようにする。.jpgも入れる。(投稿されたものがjpg以外の者の可能性もあるので形式もカラムに入れる)
デフォルト画像をviewに表示する
users/show.html.erb
<img src="<%= "/user_images/#{@user.image_name}" %>">
htmlのため/ではじまる。
public内に専用フォルダを作成し、そこに画像データを格納、画像の名前をDBに格納
- createアクションを作成し、そこで下記を行う。
- public/に画像を格納
- 画像の名前をDBに保存
inputの設置
users/edit.html.erb
<%= form_tag("URL",{multipart:true}) %>
<input name="image" type="file">
form_tagには{multipart:true}を設定し、inputのtypeもfileに
updateアクションを作成し、画像を編集できるようにする
user_controller.rb
if params[:image]
@user.image_name = "#{@user.id}.jpg"
image = params[:image]
File.binwrite("public/user_images/#{@user.image_name}", image.read)
end
もしimageが入っていた場合、@user.image_nameにその画像の名前を入れて
user_controller.rb
File.binwrite("public/user_images/#{@user.image_name}", image.read)
でフォルダに保存