BNBのプログラミング勉強記録

ガチのプログラミング初心者が駆け上がっていくブログ

メモ(Rails VII)

カラム追加

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 
    #「:users ,」というようにスペース入ってると通らない!要注意!!
  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