LoginSignup
1
0

More than 3 years have passed since last update.

Railsビギナーやってみた【第2章】

Last updated at Posted at 2020-06-15

第2章 ユーザー登録・ログイン機能作成


devise(gem)を使う準備

Gemfileにgem 'devise'を追加し、ターミナルでbundle install実行
rails g devise:installを実行した後、rails g devise userでuserモデルを作成
これでルーティングも自動で作成される。

ログアウトリンクの設置

部分テンプレートの表示:appビューののbody内部に<%= render 'layouts/header' %>を追加
部分テンプレートの作成:ビューのlayoutsフォルダに_header.html.erbファイルを作成

ログイン、ログアウトで表示するリンクを変える

<% if user_signed_in? %>を使う←user_signed_in?はdeviseが用意してくれているメソッドなので定義しなくてもよい


メール認証機能をつける

本人のメールアドレスのみ登録を受け付ける

deviseを使った認証機能

・userモデルのファイルに:confirmableを追加
・config/environments/development.rb(=設定/環境/開発ファイル)にconfig.action_mailer.default_url_options = { host: "localhost", port: 3000 }を追加

●開発環境で送られたメールを確認する
・Gemfileのgroup :development do内にgem 'letter_opener_webを追加しbundle installを実行
・開発ファイルの、先ほど追加した下あたりにconfig.action_mailer.delivery_method = :letter_opener_webを追加
・ルートファイルに下記コードを追加

routes.rb
if Rails.env.development?
 mount LetterOpenerWeb::Engine, at: "/letter_opener"
end
⚠️メール認証機能を実装した後に新規登録ができなくなった

スクリーンショット 2020-06-13 18.43.33.png
confirmed_atが見つからないと言われてしまいました
多分userモデル作成時に、マイグレーションファイル内のコメントアウトを外さないままrails db:migrateしてしまったことが原因?
こちらを参考に、エラー解消できました。
bin/rails db:dropでデータベースをdrop(削除)して再度設定・マイグレートし直します

メールの文章内容や新規登録・ログイン画面の文章を編集する

rails g devise:viewsでdeviseが用意しているビューフォルダを呼び出す


ユーザーの詳細ページを作成

usersテーブルにnameカラムを追加する

rails g migration AddNameToUsersを実行し、作成されたマイグレーションファイルのdef change内にadd_column :users, :name, :stringを追加➡️migrateする
●新規登録フォームの書き換え
●ストロングパラメータを設定する
・ユーザー新規登録機能のコントローラファイルを作成:rails g devise:controllers users
app/controllers/users/registrations_controller.rbが新規登録用のコントローラになる。configure_sign_up_paramsに関する部分のコメントアウトを外す
・カスタマイズしたコントローラファイルを適用するためにルーティングファイルを書き換える
devise_for :usersの続きにcontrollers: { registrations: 'users/registrations' }を追加
●ユーザーの詳細ページを表示するコントローラの作成 rails g controller users
●showアクションの定義、ルーティング、ビューファイルの作成

⚠️新規登録してもnameカラムが空になる?

新規登録用コントローラのコメントアウトを外した部分のkeyをnameにしていなかったこと・ルートファイル内のスペルミスが原因でした。


ユーザーと質問を紐付ける

questionテーブルに、user_idとカラムを持たせる
●マイグレーションファイルを作成 rails g migration AddUserIDToQuestions
・def change内にadd_reference :questions, :user, foreign_key: true➡️migrate実行

●user_idに値を入れる処理
・questionコントローラのcreateアクション書き換え
current_userはdeviseが用意してくれている

●モデルの関連づけ(アソシエーション)
・userモデルファイルにhas_many :questions
 questionモデルファイルにbelongs_to :userを追加することで、1人のユーザーに対して複数の質問、また1つの質問に対して1人のユーザーを関連づけることができる
・↑のhas_many〜の続きに、depandent: destroyを追加すると、ユーザーを削除した時、作成した質問も一緒に削除する

●ユーザー詳細ページに、作成した質問のタイトル一覧を表示する
・アソシエーションを使っているので、@user.questionsでそのユーザーの質問を取得できる


質問の編集・削除機能を作る

●ルーティング
・`get "/questions/:id/edit", to: "questions#edit"
・patch "/questions/:id", to: "questions#update"⭐️
・delete "/questions/:id", to: "questions#destroy"

●アクション定義とビュー作成
・editアクションで@questionに代入しているので、form_withタグで指定したmodel: @questionで編集フォームができる

●質問の詳細ページに編集・削除ページへのリンクを貼る
・削除ページのリンクタグ内にはmethod: :HTTPリクエストメソッド, data: {confirm: "メッセージ"}を指定する

●ログインしているユーザーのみ編集・削除・質問できるようにする
deviseのメソッドを使う(authenticate_user!)
・questionsコントローラにbefore_action :authenticate_user!, only: [:new, :create, edit, update, :destroy]

●質問を作成した本人のみ編集・削除できるようにする
・↑の下にbefore_action :ensure_correct_user, only: [:edit, :update, :destroy]
・ensure_correct_userをprivate下に定義する
◎find(params[:id])とfind_by(id: params[:id])の違いについて
 値が見つからなかった時の処理が異なる 参考
 find:エラーになる
 find_by:nilを返す

●編集・削除リンクを、質問を作成した本人にのみ表示する


学んだこと

●ビューでのrenderは部分テンプレートを表示する
●link_toメソッドのmethod:はHTTPリクエストメソッドの種類を指定する。指定しなければgetになる
data: {confirm: "テキスト"}でリンクがクリックされた時のアラートを表示する
●ulタグ=順序のないリストタグ。関連性・規則性のあるものに使用(ナビゲーションメニューやスライドショーなど)
●Rubyの埋め込みコード:表示したい場合は<%= %>だが、表示の必要がなければイコールは必要ない
●一度マイグレーションを実行した後に修正する時は、ロールバックしてから修正し、bin/rails db:migrateを実行する必要がある
●add_referenceはテーブルの関連づけに必要なカラムを作成する。自動的にカラム名に_idが付けられる
 外部キー制約(foreign_key: true):外部キーを作る時にあるとよりセキュリティが強固になるもの
●アソシエーションって便利
●ルーティングのメソッド:patch(リソースの部分更新)とdelete
●一括自動ルーティング resources :コントローラ名
 rails routes実行し確認

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0