気の向くままに書き綴る

勉強会参加したメモや日々の思ったことのメモ等

Rails4:device3.1.1でカラムを追加する方法

■前提条件

Version

rails 4.0.0

ruby 2.0.0-p247

device 3.1.1

Device

.rbenvで入れたのでDeviceの元は下記のディレクトの中にある

 ~/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/devise-3.1.1/

 

■やりたいこと

  1. Deviceを最大限利用しつつ
  2. 名前(ここではnickname:string)入力用のカラムを追加する
  3. nicknameでの認証は行わない

(ようはoverrideして、カラム追加するだけ

 *ユーザー新規作成とユーザー編集の両方でNicknameを使うようにする

 

ではさっそく、

1.まずはカスタマイズしていくために、ViewとControllerとModelを準備

$ vim Gemfile
gem 'devise'
$ bundle install
$ rails generate devise:install
      create  config/initializers/devise.rb
   identical  config/locales/devise.en.yml
$ vim config/environment/development
config.action_mailer.default_url_options = { :host => 'localhost:3000' }
$ rails generate devise:views users
      invoke  Devise::Generators::SharedViewsGenerator
      create    app/views/users/shared
      create    app/views/users/shared/_links.erb
      invoke  form_for
      create    app/views/users/confirmations
      create    app/views/users/confirmations/new.html.erb
      create    app/views/users/passwords
      create    app/views/users/passwords/edit.html.erb
      create    app/views/users/passwords/new.html.erb
      create    app/views/users/registrations
      create    app/views/users/registrations/edit.html.erb
      create    app/views/users/registrations/new.html.erb
      create    app/views/users/sessions
      create    app/views/users/mailer/unlock_instructions.html.erb

$ rails generate devise User
      invoke  active_record
      create    db/migrate/YYYYMMDDHHMMDD_add_devise_to_users.rb
      insert    app/models/user.rb
       route  devise_for :models

→nicknameを追加

rails generate migration AddNicknameToUsers nickname:string

→パスを通します

$vim config/route.rb

  2   devise_for :users, :controllers => { :sessions => 'users/sessions', :registrations => 'users/registrations'},
  3     :path_names => { :sign_in => 'login',
  4       :sign_out => 'logout',
  5       :password => 'secret',
  6       :confirmation => 'verification',
  7       :unlock => 'unblock',
  8       :registration => 'register',
  9       :sign_up => 'cmon_let_me_in'
 10   }

 

→Headerにログインとかログアウトとか編集とか画面遷移できるように編集

$vim app/views/layouts/application.html.erb

31             %ul.nav
 32               - if user_signed_in?
 33                 %strong= "Logged in as" + current_user.email
 34                 %li= link_to 'Edit profile', edit_user_registration_path, :class => 'navbar-link'  |
 35                 %li= link_to "Logout", destroy_user_session_path, method: :delete, :class => 'navbar-link'
 36               - else
 37                 %li= link_to "Sign up", new_user_registration_path, :class => 'navbar-link' |
 38                 %li= link_to "Login", new_user_session_path, :class => 'navbar-link'                      

 

Hamlなので、以下のURLのStep5を参考にしてください。

Devise で認証機能を追加

 

 

 

2.Viewを編集

以下、Formの中にパラメータを追加

$vim app/views/users/registrations/new.html.erb

  6   <div><%= f.label :nickname %><br />
  7   <%= f.text_field :nickname, :autofocus => true %></div>

$vim app/views/users/registrations/edit.html.erb

  5   <div><%= f.label :nickname %><br />
  6   <%= f.text_field :nickname, :autofocus => true %></div>

 

3.Controllerを編集

今回パラメータの追加をしたため、その部分を適応できるようする。

(やらなかった場合、保存されない。あとで気づいた^^;)

 

以下をoverrideする。Deviceの中身を確認。

$vim app/controllers/devise/registrations_controller.rb

[略]

125   def sign_up_params
126     devise_parameter_sanitizer.sanitize(:sign_up)
127   end
128
129   def account_update_params                                                                                                                                                          
130     devise_parameter_sanitizer.sanitize(:account_update)
131   end

 

んで、実際にoverrideした部分

$vim app/controllers/users/registrations_controller.rb

  1 class Users::RegistrationsController < Devise::RegistrationsController
  2   def new
  3      super
  4   end
  5
  6   def create
  7     super
  8   end
  9
 10   def sign_up_params
 11     devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:email,:nickname,:password,:password_confirmation) }
 12     super
 13   end                                                                                                                                                                                
 14
 15   def account_update_params
 16     devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:email,:nickname,:password,:current_password,:password_confirmation) }
 17     super
 18   end

 

4.rake db:migrate;rails sで実際に確認

 

 

参考URL

Devise で認証機能を追加

Rails4.0.0におけるdeviseのstrong_parametersに関するカスタマイズ方法