【Rails4】Deviseでユーザーを楽に管理する

Gemfileに追記

gem 'devise'


ジェネレータでdeviseをインストール

$ bundle install 
$ bundle exec rails g devise:install

ユーザテーブルを作成

$ bundle exec rails generate devise User

これだけだと独自に設定したいフィールドを追加できないためmigrationを編集する
ちなみに今回は first_name と last_nameを追加している。
db/migrate/...._devise_create_users.rb

class DeviseCreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|

      ##add origin field
      t.string :first_name,        null: false
      t.string :last_name,         null: false

      ## Database authenticatable
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""

      ## Recoverable
      t.string   :reset_password_token
      t.datetime :reset_password_sent_at

      ## Rememberable
      t.datetime :remember_created_at

      ## Trackable
      t.integer  :sign_in_count, default: 0, null: false
      t.datetime :current_sign_in_at
      t.datetime :last_sign_in_at
      t.string   :current_sign_in_ip
      t.string   :last_sign_in_ip

      ## Confirmable
      # t.string   :confirmation_token
      # t.datetime :confirmed_at
      # t.datetime :confirmation_sent_at
      # t.string   :unconfirmed_email # Only if using reconfirmable

      ## Lockable
      # t.integer  :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts
      # t.string   :unlock_token # Only if unlock strategy is :email or :both
      # t.datetime :locked_at


      t.timestamps null: false
    end

    add_index :users, :email,                unique: true
    add_index :users, :reset_password_token, unique: true
    # add_index :users, :confirmation_token,   unique: true
    # add_index :users, :unlock_token,         unique: true
  end
end

編集が完了したらmigrationを反映

$ rake db:migrate


続いてユーザーを新規登録する。
viewに関しては自動生成されているのでサーバーを立ち上げ、以下のURLにアクセス
http://localhost:3000/users/sign_up

これで登録画面が表示されれば成功。

ただし、このままだと追加した first_name と last_nameを登録できないため修正をする。

以下のコマンドでViewを生成。

$ rails generate devise:views


修正するのにHTMLを書くのは面倒なのでSlimに一括変換する。
以下のGemを導入。

gem 'slim-rails'
gem 'html2slim'


Rubyワンライナーで一括更新

$ bundle install
$ for file in app/views/devise/**/*.erb; do erb2slim $file ${file%erb}slim && rm $file; done


これでerbがslimに変換される。

本題のfirst_name, last_nameを登録するため以下のviewを編集

app/views/devise/registrations/new.html.slim

h2
  | Sign up
= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f|
  = devise_error_messages!
  .field
    =f.label :first_name
    br
    =f.text_field :first_name
  .field
    =f.label :last_name
    br
    =f.text_field :last_name
  .field
    = f.label :email
    br
    = f.email_field :email, autofocus: true
  .field
    = f.label :password
    - if @minimum_password_length
      em
        | (
        = @minimum_password_length
        |  characters minimum)
    br
    = f.password_field :password, autocomplete: "off"
  .field
    = f.label :password_confirmation
    br
    = f.password_field :password_confirmation, autocomplete: "off"
  .actions
    = f.submit "Sign up"
= render "devise/shared/links"


続いてControllerを生成

$ rails g controllers users


生成されたcontrollerを編集
app/controllers/users/registrations_controller.rb

class Users::RegistrationsController < Devise::RegistrationsController
 before_action :configure_sign_up_params, only: [:create]
# before_action :configure_account_update_params, only: [:update]

  # GET /resource/sign_up
  # def new
  #   super
  # end

  # POST /resource
   def create
     super
   end

  # GET /resource/edit
  # def edit
  #   super
  # end

  # PUT /resource
  # def update
  #   super
  # end

  # DELETE /resource
  # def destroy
  #   super
  # end

  # GET /resource/cancel
  # Forces the session data which is usually expired after sign
  # in to be expired now. This is useful if the user wants to
  # cancel oauth signing in/up in the middle of the process,
  # removing all OAuth session data.
  # def cancel
  #   super
  # end

   protected

  # If you have extra params to permit, append them to the sanitizer.
   def configure_sign_up_params
     devise_parameter_sanitizer.permit(:sign_up, keys: [:first_name, :last_name])
   end

  # If you have extra params to permit, append them to the sanitizer.
  #  def configure_account_update_params
  #  devise_parameter_sanitizer.permit(:account_update, keys: [:attribute])
  # end

  # The path used after sign up.
  # def after_sign_up_path_for(resource)
  #   super(resource)
  # end

  # The path used after sign up for inactive accounts.
  # def after_inactive_sign_up_path_for(resource)
  #   super(resource)
  # end
end


名前は必須入力にしておきたいのでvalidationを追加。
app/models/user.rb

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
  validates :first_name, :last_name, presence: true, length: { maximum: 20 }
end

更にルーティングを編集

config/routes.rb

$ config/routes.rb


以上で設定は終了。
再度 http://localhost:3000/users/sign_up にアクセスしてフィールドが追加されていることを確認。