본문 바로가기

대학생활

[Ruby] Rails with Devise + MyPage

1. Gemfile에 Gem 추가

 

gem "devise"

 

추가된 gem 설치

 

bundle install

 

2. Devise 설치 

 

rails g devise:install

 

3. User 모델 생성 (devise 기반)

 

rails g devise User

 

4. login/register view 생성 (devise 자체 view & controller "rail routes를 통해 확인 가능")

 

rails g devise:views

 

5. 컨트롤러에 유저 인증 제한 박기 (필요시 사용 가능인데.. 안 씀 ㅎㅎ..)

 

before_action :authenticate_user!

 

6. html.erb에 유저 인증 여부 제한 박기(이 부분은 devise  쓸 때만 보이는 부분이에요~)

 

<% if user_signed_in? %> 
 <div><%= current_user~~ %></div> 
  ~~
<% else %>
  ~~
<% end %>

 

7. 회원가입 커스터마이징

 

rails g controller registers

 

config/routes.rb 회원가입에 대해서는 devise말고 따로 설정 한다고 명시(skip~~)

 

devise_for :users, skip: [:registrations]
  
devise_scope :user do
  get '/users/sign_up' => 'registers#new', as: :new_user_registration
  post 'users' => 'registers#create', as: :user_registration
  get '/users/:id/edit' => 'registers#edit', as: :edit_user
  patch '/users/:id' => 'registers#update'
end

 

app/controllers/registers_controller.rb 컨트롤러도 Devise::RegistrationsController 그대로 상속

 

class RegistersController < Devise::RegistrationsController
    def new
      @user = User.new()
    end
      
    def create
    end

    def edit
    end
  
    def update
      if @user.update(user_params)
        redirect_to root_path
      else
        render :edit_user
      end
    end

    private
    def user_params
      params.require(:user).permit(:nickname, :email, :image, :phone_num)
    end
end

 

 아마 따로 함수들 명시 안해줘도 다 알아서 해줄 거에요..

 대신 update할 때는 어떤 파라미터를 수정할 것인지 명시해주기 위해서 따로 작성해야 해요!!

 

 

8. 닉네임/전화번호(uniq 속성) 추가

 

 rails g migration add_nickname_to_users nickname:string
 rails g migration add_phone_to_users phone_num:string:uniq
 rake db:migrate

 

9. 이미지 삽입을 위한 라이브러리 설치 및 migration 설치

 

sudo apt install imagemagick

rails active_storage:install <--- migration 파일로 저장
rails g action_text:install  <--- migration 파일로 저장
rails db:migrate

 

config/environment/developement.rb에 추가 (배포할 땐 production.rb에 추가해야 될지도..?)

 

config.active_storage.variant_processor = :mini_magick

 

10. app/models/user.rb 모델 안에 이미지 붙이는 칼럼 생성

 

class User < ApplicationRecord
    devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
    has_one_attached :image # 하나의 이미지 업로드
    has_many_attached :pictures # 여러 이미지 업로드
    has_rich_text :body # 글 안에 이미지 업로드
end

 

11. 이미지 태그 in html.erb 파일

 

<%= image_tag(current_user.image, style:"width:100px; height:100px") %>

 

 

12. app/views/에  registers란 폴더를 만들고 edit, new 폼(form) 생성

 

new.html.erb

<div>
    <div>
        <h3>Sign up</h3>
        <div>
            <div>
                <% @user.errors.full_messages.each do |message| %>
                <div class="form-error"> <%= message %> </div>
                <% end %>

                <%= form_with model: @user do |form| %>

                    <div>
                        <%= form.label :nickname %><br>
                        <%= form.text_field :nickname %>
                    </div>

                    <div>
                        <%= form.label :email %><br>
                        <%= form.text_field :email %>
                    </div>

                    <div>
                        <%= form.label :phone_num %><br>
                        <%= form.text_field :phone_num %>
                    </div>
                  
                    <div>
                        <%= form.label :password %><br>
                        <%= form.password_field :password %>
                    </div>

                    <div>
                        <%= form.label :image %><br>
                        <%= form.file_field :image %>
                    </div>
                  
                    <div>
                      <%= form.submit %>
                    </div>
                <% end %>
            </div>
        </div>
    </div>
</div>

 

edit.html.erb

<div>
    <div>
        <h3>My Page</h3>
        <div>
            <div>
                <% @user.errors.full_messages.each do |message| %>
                <div class="form-error"> <%= message %> </div>
                <% end %>

                <%= form_with model: @user do |form| %>

                    <div>
                        <%= form.label :nickname %><br>
                        <%= form.text_field :nickname %>
                    </div>

                    <div>
                        <%= form.label :email %><br>
                        <%= form.text_field :email %>
                    </div>

                    <div>
                        <%= form.label :phone_num %><br>
                        <%= form.text_field :phone_num %>
                    </div>

                    <div>
                        <%= form.label :image %><br>
                        <%= form.file_field :image %>
                    </div>
                  
                    <div>
                      <%= form.submit %>
                    </div>
                <% end %>
            </div>
        </div>
    </div>
</div>

 

 

 이 정도로 하고 rails server하면 잘 될 거에요!! 회원가입(registration)말고도 로그인도 원한다면 커스터마이징 할 수 있습니다!! 근데.. ㄹㅇ rails는 너무 high level 프레임워크인 거 같아요,, 밑에 뜯어보려면 대단한 용기가 필요한 거 같아요 ㅠㅠㅠㅠ

 

참고 자료

https://www.youtube.com/watch?v=1cw6qO1EYGw 

https://negabaro.github.io/archive/login-register-custom

 

Rails devise custom 설정

 

negabaro.github.io