1
2

More than 3 years have passed since last update.

form_withのurl解説&Ruby on Railsでログイン機能を作ろう!

Last updated at Posted at 2019-10-13

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

更に、以下に追加していく

・コントローラー

user_controller.rb
private
    def user_params
      params.require(:user).permit(:name, :email, :password, :password_confirmation)
    end

・モデル

user.rb
class User < ApplicationRecord
  has_secure_password
end

・ビュー

form.html.erb
  <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を作る。

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はどこで見つけたのかというと...

スクリーンショット 2019-10-13 20.06.27.png

urlの指定方法を理解するのに大分苦労していたけど、灯台下暗し...
思いっきりエラー画面のHeader欄に指定方法があった。

ちなみにroutas.rbはこうなってる。

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など基本的なアクションは指定されていると理解。

完成!

新規登録とログイン画面が作れたので、これを元にまた何か作ろうと思う。

1
2
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
2