カラム追加
rails g migration add_image_name_to_users
- これまで「rails g model」によって生成されてきたマイグレーションファイルは、changeメソッドの中身が自動生成されていた
- なので、マイグレーションファイルの中身を特に変更すること無く、そのまま「rails db:migrate」コマンドを実行することでデータベースに変更を反映することができていた
- 今回のようにカラムを追加した場合、自分でchangeメソッドの中身を書く必要がある
- changeメソッドの中身を追加したら、「rails db:migrate」でデータベースに変更を反映
class AddImageNameToUsers < ActiveRecord::Migration[5.0]
def change
add_column :users,:image_name,:string
end
end
画像の送信
- 脳がバグりかけた
- 画像の送信は特殊なので、form_tagに{multipart: true}を追加する必要がある
- 画像は、コンピュータから見ると、コンピュータ用の文字で書かれたファイルなのである。しかし、それ以外はテキストファイルなどと同じで、普通のファイルと言って良い。
- Rubyのコードでファイルを扱うには、Rubyに元から用意されてあるFileクラスのwriteメソッドを使う。「File.write(ファイルの場所, ファイルの中身)」
- 画像ファイルもparams[:image]とすることで受け取ることができる
- 画像データは特殊なテキストファイルであるため、File.writeではなくFile.binwriteを用いる必要がある
- params[:image]を代入した変数imageに対し、readメソッドを用いることでその画像データを取得できる
- 画像を保存する処理は、画像データが送信された場合だけ実行するようにする(if params[:image] のようにする)
<%= form_tag("/users/#{@user.id}/update", {multipart: true}) do %>
<p>ユーザー名</p>
<input name="name" value="<%= @user.name %>">
<p>画像</p>
<input name="image" type="file">
<p>メールアドレス</p>
<input name="email" value="<%= @user.email %>">
<input type="submit" value="保存">
<% end %>
if params[:image]
@user.image_name="#{@user.id}.jpg"
image=params[:image]
File.binwrite("public/user_images/#{@user.image_name}",image.read)
end