처음 devise ② -- 컬럼을 추가해 본다 -- ~ 해보자 커스마이즈! ~
커스터마이즈도 여러가지 할 수 있어 편리할 것 같다! 하지만 조사하면 잘 다룰 때까지 어려울 것 같다. .
자신의 이해를 깊게 하기 위해서도, 몇 번에 나누어 정리해 보기로 했습니다.
1회째는 이쪽
정중판 : 첫 번째 devise ① - 소개 해보기 -
코드 전용 버전 : 빨리 devise 가고 싶다! ① - 입문 순서로 도입해 보자 -
지난번에는 devise의 최소한의 도입이 가능했습니다.
이번에는 다음의 커스터마이즈를 실시합니다.
1. 모델에 name(이름) age(연대) 열을 추가합니다.
2. 뷰에 추가한 열을 표시합니다.
3. 추가한 열을 DB에 등록할 수 있습니다.
환경
절차
① 자신의 컬럼 추가
이름 이름과 같은 두 개의 열을 추가합니다.
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에 반영됩니다.
보기를 꼼꼼히 확인해 보세요. 물론 콘솔에서도 확인할 수 있습니다.
Reference
이 문제에 관하여(처음 devise ② -- 컬럼을 추가해 본다 -- ~ 해보자 커스마이즈! ~), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/uloruson/items/40154b4be19d1ac900f3텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)