Ruby on Railsでログイン機能を作ろう!
と思い立ちやってみた。
ソースコード
github:https://github.com/CoffCookie/webapp.git
0.環境
Rails: 5.2.3
Ruby: 2.6.3
1.作るものを分解してみる
ユーザ登録機能
データ
・ユーザ名
・email
・パスワード
の3つを入力して新規登録しログイン、ログアウトできるようにする。
2.ユーザ登録機能、ログイン,ログアウト機能を作る。
1.プロジェクト作成
$ rails new webapp
$ bundle exec rake db:migrate
2.登録画面作成
$ rails generate scaffold user name:string email:string
3.パスワード作成
https://qiita.com/chobi9999/items/20b962a324a0bdbfc0dc
上記参考にしながら追加。
まず、DBにパスワード追加
$ rails generate migration add_password_digest_to_users password_digest:string
更に、以下に追加していく
・コントローラー
private
def user_params
params.require(:user).permit(:name, :email, :password, :password_confirmation)
end
・モデル
class User < ApplicationRecord
has_secure_password
end
・ビュー
<div class="field">
<%= form.label :password, "パスワード" %>
<%= form.password_field :password %>
</div>
<div class="field">
<%= form.label :password_confirmation, "パスワードの再入力" %>
<%= form.password_field :password_confirmation %>
</div>
※カラムはpassword_digestだけど、
フォームやコントローラーには、password,password_confirmationとして扱う。
ちょっとややこしい...。
・ログインフォームを作る
users_controller.rbにloginとshowloginアクション、viewにshowlogin.html.erbを作る。
<%= form_with( model: user, local: true) do |form| %>
これでできるかなと思ったけど、うまくいかない...。
そのため、
form_withのmodelの自動推測について調べてみる。
抜粋:https://qiita.com/hmmrjn/items/24f3b8eade206ace17e2
モデルを渡したときは、URLとスコープが自動推測されます。(これまでのform_for と同じ。)
URL: @userがDBに存在するときは、updateアクションに、ないときは、createアクションに飛びます。
つまり、これでは、updateアクションに行ってしまい、
before_action :set_user, only: [:show, :edit, :update, :destroy]
が実行されてうまくいかないようだ。
form_withは自動推測じゃなく確実にloginアクションに行くようにするには、urlを指定するとうまくいく事がわかった。
<%= form_with( url: users_login_path, local: true) do |form| %>
では、users_login_pathはどこで見つけたのかというと...
urlの指定方法を理解するのに大分苦労していたけど、灯台下暗し...
思いっきりエラー画面のHeader欄に指定方法があった。
ちなみにroutas.rbはこうなってる。
post "users/login" => "users#login"
post "users/logout" => "users#logout"
get "users/showlogin" => "users#showlogin"
resources :users
おまけに、
resources :usersに
new,update,show,editなど基本的なアクションは指定されていると理解。
完成!
新規登録とログイン画面が作れたので、これを元にまた何か作ろうと思う。