0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

rails 'gem devise' 名前でログインする

Posted at

#gem devise名前でログインする方法
参考にさせていただきました

[@linkss [Devise.rb設定ファイル項目まとめ]][link-1]さん
[link-1]:https://qiita.com/linkss/items/9b005ebc2ef81a39afa2

[@matsubishi5 [【Rails】deviseを用いた名前ログイン機能の実装
]][link-2]さん
[link-2]:https://qiita.com/matsubishi5/items/5bd8fdd45af955cf137d

[@Orangina1050 [[初心者] deviseを使ってログイン機能を実装してみよう]][link-3]さん
[link-3]:https://qiita.com/Orangina1050/items/a16e655519a60f35b394

ありがとうございます


###アプリ作成

terminal
rails new hujityaku --skip-bundle

hujityaku(不時着)という名のアプリ作成

terminal
cd hujityaku

hujityakuディレクトリ移動

terminal
bundle install --path vendor/bundle

bundle installする

terminal
rails s

rails sで立ち上がればOK

##トップ画面作成

terminal
rails g controller home top
routes.rb
Rails.application.routes.draw do
  root to: 'home#top'
end
home_controller.rb
class HomeController < ApplicationController
  def top
  end
end

viewはそのままで行きます

##gem devise導入

Gemfile
gem 'devise' < 追記 >
terminal
bundle install
terminal
rails g devise:install
terminal
rails g devise User name:string

rails g devise User name:stringの記述で、devise Userモデルにデフォルトであるemail, passwordなど以外に追加で名前ログインするためのnameカラムを生成してくれる

terminal
rails db:migrate
terminal
rails g devise:controllers users

これをきちんと指定しないと、のちにroutesで失敗する。私自身、これにハマりました。

terminal
rails g devise:views users

##名前ログインのため編集もろもろ

routes.rb
Rails.application.routes.draw do
  root to: 'home#top'

  devise_for :users, controllers: {
    sessions: 'users/sessions',
    registrations: 'users/registrations'
  }
end

上記の様に記述する事でViewの変更が可能になる。
※ 「devise_for :users」のままでは、既存のViewが表示されてしまい、Viewの編集が効かなくなる。

users/registrations/new.html.erb
-------省略--------
------<追記>-------
<div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name, autofocus: true, autocomplete: "name" %>
  </div>

-----<ここまで>----

  <div class="field">
    <%= f.label :email %><br />
    <%= f.email_field :email, autofocus: true, autocomplete: "email" %>
  </div>
-------省略--------

users/sessions/new.html.erb
< 削除 >

<div class="field">
    <%= f.label :email %><br />
    <%= f.email_field :email, autofocus: true, autocomplete: "email" %>
</div>

これを消して以下に変更

users/sessions/new.html.erb
< 追記 >

<div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name, autofocus: true, autocomplete: "name" %>
</div>

application_controller.rb編集

application_controller.rb
class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller? 

  private

    def configure_permitted_parameters
      devise_parameter_sanitizer.permit(:sign_up,keys:[:email])
    end
end

devise_parameter_sanitizer.permit(:sign_up,keys:[:email])とする理由は、
ユーザー認証時に使用するキーを

config/initializers/devise.rb
#49行目をコメントアウトして[:name]に変更
config.authentication_keys = [:name]

に変更したため新規登録時にユーザー認証時に使用するキーがnameになる。
そのため、(:sign_up,keys:[:email])で新規登録時にemailというパラメーターを追加で許可するようにしていしなければならない。

名前でログインする必要がなければ、必要ないが今回は、名前ログインする方法なのでこのようにした

あとは、home#topの記述を変更するだけでOK

views/home/top/html.erb
<% if user_signed_in? %>
  <%= link_to "ログアウト", destroy_user_session_path, method: :delete %> 
<% else %>
  <%= link_to "ログイン", new_user_session_path, class: 'post' %>
  <%= link_to "新規登録", new_user_registration_path, class: 'post' %>
<% end %>

以上です。間違いあれば教えてください。

0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?