困ったことを書いたものです。
テーブルに新しいカラムを追加する
rails generate migration user image_name:string
userモデルにstring型のimage_nameカラムを追加する
add_column(テーブル名, カラム名, タイプ(データ型), オプション引数)
テーブルを編集したときは
rails db:migrate
ユーザー登録時に初期画像を設定
登録時のアクションに新しく追加しする
@user = User.new(
name: params[:name],
email: params[:email]
image_name: "default_user.jpg"
)
カラムに書いておく。
出典 https://qiita.com/you8/items/137c87945da3cac19953
SyntaxError in UsersController#show
追加したカラムに,
をつけ忘れた。
画像が表示されない
<img src="<%= "default_user.jpg" %>">
最初は表示されなかった。
<img src= "<%= "/user_images/default_user.jpg" %>">
user_imagesのファイルから取り出すようにした。
表示されたが合格できなかった。
これだと 全員のユーザーの画像がこれになってしまうので
<img src= "<%= "/user_images/#{@user.image_name}" %>">
image_nameカラムから引っ張ってくることで一人一人の画像を表示することができる。
rails の流れ(rails特有)
<img src= "<%= "/user_images/#{@user.image_name}" %>">
このurlの要求をしたらrailsは最初public
ファイルからuser_images
を探し出し特定のファイルを見つける。
しかし
publicの中になかった場合はroutes.rb
からリクエストのパターンと同じものを探しコントローラからアクションを作動させる。
ユーザー画像を編集
画像を保存ボタンを押されたときにデータを送信する
form_tag(リンク先={}, オプション={}, HTML属性={} or イベント属性={}, ブロック引数)
:multipart
マルチパートを指定をすることで画像を送ることができる。
<%= form_tag("/users/#{@user.id}/update", {multipart: true}) do %>
<input type="file" src="button.gif" alt="保存">
一応画像を選択することはできる。
送信するためにファイルを保存することができる。
画像データが存在する時にだけ画像が保存されるようにしてください。
何だろうこの意味?
if params[:image_name]
こうすることで中身が入っていいたらTrue
になる。
NoMethodError in UsersController#update
undefined method `read'
.
.
.
if params[:image_name]
@user.image_name = params[:image_name]
image = @user.image_name
File.binwrite("public/user_images/#{@user.image_name}", image.read)
end
.
.
.
<input name="image" type="file">
nameをimageにするとparamsのパラメータの名前も変えなければならない
params[:image]
imageに直す
成功
Fileクラス
File.write(ファイルの場所, ファイルの中身)
ファイルを読み込んでファイルを作成することができます
File.binwrite("public/user_images/#{@user.image_name}", image.read)
public/user_images/#{@user.image_name}
の場所にファイル(imageの内容)を作成することができる。
read
全ての文字列を読み込む