Progate_Ruby on Rails5道場コース3

1・目標物の確認
2・画像の名前を格納するカラムの追加

・ターミナルで「rails g migration マイグレーションファイル名」
・作成したマイグレーションファイルのchangeの中で
 「add_column :users :追加するカラム名 :データ型」
・ターミナルで「rails db:migrate」

3・初期画像の設定

・user_controllerのcreateアクションに「image_name= "初期画像のファイル名"」
・show.html.erbに画像を表示させるコードを追加
 <img src="<%=”/user_images/#{@user.image_name}”%>">、
 ※HTMLのコードにRubyのコードを埋め込むため書き方要注意

4・画像編集機能

・画像選択:editのinputタグで「type="file"」(nameはimage)
・form_tagに{multipart: true}を追加

・送信された画像ファイル、画像名の保存
 +もし画像があれば保存なのでif params[:image]〜end
 +データベースで保存される名前は指定どおり「"#{@user.image_name}.jpg"」
 +image=params[:image]で画像を受け取る
 +Fileクラスのwriteメソッドを使ってファイルを生成
  File.binwrite("public/user_images/#{画像名}", image.read)

5・パスワードカラムの作成

・ターミナルで「rails g migration マイグレーションファイル名」を実行し
 作成されたファイルに「add_column :users :password :データ型」
・「rails db:migrate」でデータベースに反映
・Userモデルにバリデーションを追加
・「rails console」を起動して「user=User.find_by(id:1)」
 「user.password="好きな文字列"」でsaveメソッド
・データベースにパスワードが保存される

6・ログインフォーム

・ルーティング「"login"」で「"users#login_form"」
・ビューファイル「login_form.html.erb」を作成して指定のコードを貼り付け
・コントローラにlogin_formアクションを定義
・application.html.erbに「ログイン」リンクの作成

7・ログイン処理の追加

・ルーティング「post "login"=>"users#login"」
・ビューファイル「login_form.html.erb」
 +form_tagを追加
 +メールアドレス(email)、パスワード(password)にnameタグ追加
・コントローラにloginアクションを定義
 +@user=User.find_by(email: params[:email],password: params[:password])
 +ifで条件を「@user」
 +成功:session[:user_id]に@user.idを代入、flash、redirect
 +失敗:render
・application.html.erbにifでsession[:user_id]がtrueならログインユーザーのidを表示させる文を追加
 

8・ユーザーが存在しない場合

・7で作成したloginアクションのif文に失敗した場合の処理を追加
 +@error_messageに指定の文を代入
 +初期値の表示用に@email=params[:email](@passwordはparams[:password])
・login_form.html.erb
 +指定のコードを指定の場所に貼り付けif文の条件は@error_message(表示内容も同様)
 +emailに「value="<%= @email%>"」(passwordも同様)

9・ユーザー登録時にログイン状態にする

・new.html.erbに指定のコードを貼り付け、name="password"、valueにemailと同じように初期値
・createアクションにpasswordの情報追加、登録が成功した場合はsession[:user_id]=@user.id処理させる

10・ログアウト機能

・ログアウト「logout」のルーティング(post)
・コントローラにlogoutアクションを追加
 +session[:user_id]をnil
 +フラッシュ、リダイレクト
・application.html.erbにログアウトのリンク先を追加、{method: "post"}を忘れずに!
 +if文で条件session[:user_id]、
  trueの場合は指定のものだけ表示、elseでfalseの場合の表示に分ける

11・ログインユーザー名を表示

・applicationコントローラにメソッドを追加(set_current_user)
 +メソッドに@current_user=User.find_by(id: session[user_id])を追加
 +before_actionでアクションが呼び出される際に共通の処理をさせる
  before_action :set_current_user
・application.html.erbのsession[:user_id]を@current_userに修正
 +表示される内容は名前なので「@current_user.name」
 +link_toメソッドを使ってユーザー詳細へ(/users/@current_user.id)

12・ログインしていない場合の制限

・applicationコントローラにアクセス制限用のメソッドを作成
 +@current_userがnilの場合はフラッシュ、リダイレクト
・posts、usersコントローラにbefore_actionを追加
 +特定のアクションのみで実行→before_action :共通メソッド名,{only:[アクション名]}

13・ログインしている場合の制限

・applicationコントローラにログインユーザ制限用のメソッドを作成
 +@current_userがtrueの場合はフラッシュ、リダイレクト
・users、homeコントローラにbefore_actionが指定のアクションのみ実行されるよう追加。

14・自分の情報のみ編集できるように制限する

・usersコントローラにユーザーを確かめるためのメソッドを追加
 +ログイン中のユーザーid(@current_user.id)と
  編集したいユーザのid(params[:id])が同じでない場合(if a!=b〜end)は
  フラッシュ、リダイレクト
 +usesコントローラの先頭に「before_action」を
  指定のアクションのみ実行されるよう追加。