처음 devise ② -- 컬럼을 추가해 본다 -- ~ 해보자 커스마이즈! ~

웹 앱의 중요한 기능 중 하나인 로그인 인증 관리를 간단하게 도입하는 gem입니다.
커스터마이즈도 여러가지 할 수 있어 편리할 것 같다! 하지만 조사하면 잘 다룰 때까지 어려울 것 같다. .
자신의 이해를 깊게 하기 위해서도, 몇 번에 나누어 정리해 보기로 했습니다.

1회째는 이쪽
정중판 : 첫 번째 devise ① - 소개 해보기 -
코드 전용 버전 : 빨리 devise 가고 싶다! ① - 입문 순서로 도입해 보자 -

지난번에는 devise의 최소한의 도입이 가능했습니다.
이번에는 다음의 커스터마이즈를 실시합니다.

1. 모델에 name(이름) age(연대) 열을 추가합니다.
2. 뷰에 추가한 열을 표시합니다.
3. 추가한 열을 DB에 등록할 수 있습니다.

환경


  • Ruby 2.3.3
  • Rails 4.1.16
  • Windows 8 64bit
  • devise 4.2.0

  • 절차



    ① 자신의 컬럼 추가



    이름 이름과 같은 두 개의 열을 추가합니다.bash
    $ rails g migration AddColumnToUsers name age
    invoke active_record
    create db/migrate/20170305070915_add_column_to_users.rb

    생성된 마이그레이션을 확인합니다.
    이번에는 이름만 조금 변경합니다. (입력 필수, 디폴트를 공백을 넣는 설정)

    20170305070915_add_column_to_users.rb
    class AddColumnToUsers < ActiveRecord::Migration
      def change
        add_column :users, :name, :string, null: false, default: ""
        add_column :users, :age, :integer
      end
    end
    

    저장하면 마이그레이션합시다.
    $ rake db:migrate
    == 20170305070915 AddColumnToUsers: migrating =================================
    -- add_column(:users, :name, :string, {:null=>false, :default=>""})
       -> 0.0050s
    -- add_column(:users, :age, :integer)
       -> 0.0003s
    == 20170305070915 AddColumnToUsers: migrated (0.0060s) ========================
    

    이제 FB에 컬럼이 추가되었을 것이다. 콘솔에서 확인합시다.
    $ rails c
    Loading development environment (Rails 4.1.16)
    $ User.column_names
    => ["id", "email", "encrypted_password", "reset_password_token", "reset_password_sent_at", "remember_created_at", "sign_in_count", "current_sign_in_at", "last_sign_in_at", "current_sign_in_ip", "last_sign_i
    n_ip", "created_at", "updated_at", "name", "age"]
    

    추가됩니다. DB에 열 추가가 완료되었습니다.

    ② View에 독자적인 컬럼의 폼 추가



    먼저 커스마이즈할 View를 만듭니다.
    devise 안내서에 따라 다음 명령을 실행합니다.
    $ rails g devise:views
    Expected boolean default value for '--markerb'; got :erb (string)
          invoke  Devise::Generators::SharedViewsGenerator
          create    app/views/devise/shared
          create    app/views/devise/shared/_links.html.erb
          invoke  form_for
          create    app/views/devise/confirmations
          create    app/views/devise/confirmations/new.html.erb
          create    app/views/devise/passwords
          create    app/views/devise/passwords/edit.html.erb
          create    app/views/devise/passwords/new.html.erb
          create    app/views/devise/registrations
          create    app/views/devise/registrations/edit.html.erb
          create    app/views/devise/registrations/new.html.erb
          create    app/views/devise/sessions
          create    app/views/devise/sessions/new.html.erb
          create    app/views/devise/unlocks
          create    app/views/devise/unlocks/new.html.erb
          invoke  erb
          create    app/views/devise/mailer
          create    app/views/devise/mailer/confirmation_instructions.html.erb
          create    app/views/devise/mailer/password_change.html.erb
          create    app/views/devise/mailer/reset_password_instructions.html.erb
          create    app/views/devise/mailer/unlock_instructions.html.erb
    

    다음은 sign_up에 대한 뷰에 추가 열을 입력 양식을 추가합니다.

    devise\app\views\devise\registrations\new.html.erb
    <h2>Sign up</h2>
    
    <%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
      <%= devise_error_messages! %>
    
    <!--  ↓これを追加↓-->
    
      <div class="field">
        <%= f.label :name%><br />
        <%= f.text_field :name, autofocus: true  %>
      </div>
    
      <div class="field">
        <%= f.label :age %><br />
        <%= f.number_field :age %>
      </div>
    
    <!--  ↑ここまで↑-->
    
      <div class="field">
        <%= f.label :email %><br />
        <%= f.email_field :email%>
      </div>
    
      <div class="field">
        <%= f.label :password %>
        <% if @minimum_password_length %>
        <em>(<%= @minimum_password_length %> characters minimum)</em>
        <% end %><br />
        <%= f.password_field :password, autocomplete: "off" %>
      </div>
    
      <div class="field">
        <%= f.label :password_confirmation %><br />
        <%= f.password_field :password_confirmation, autocomplete: "off" %>
      </div>
    
      <div class="actions">
        <%= f.submit "Sign up" %>![test.png](https://qiita-image-store.s3.amazonaws.com/0/158572/63b1513b-8ebe-268c-d039-f04162b7eb05.png)
    
      </div>
    <% end %>
    
    <%= render "devise/shared/links" %>
    

    여기까지 할 수 있으면 표시해 봅시다.



    이름과 나이가 추가되었습니다.
    버튼을 눌러도 오류도 없지만 name과 age는 DB에 등록되지 않습니다.

    ③ 추가한 컬럼을 DB에 반영



    소위 strong parameters 설정이 필요합니다.
    다음과 같이 설정할 수 있습니다.

    devise\app\controllers\application_controller.rb
    class ApplicationController < ActionController::Base
      # Prevent CSRF attacks by raising an exception.
      # For APIs, you may want to use :null_session instead.
      protect_from_forgery with: :exception
    
    # ↓これを追加↓
      before_action :configure_permitted_parameters, if: :devise_controller?
    
      protected
    
        def configure_permitted_parameters
          devise_parameter_sanitizer.permit(:sign_up, keys: [:name, :age])
        end
    # ↑ここまで↑
    
    end
    

    이제 DB에 반영됩니다.
    보기를 꼼꼼히 확인해 보세요. 물론 콘솔에서도 확인할 수 있습니다.

    좋은 웹페이지 즐겨찾기