본문 바로가기

Archived(Programming)/Ruby on Rails(기초)

RubyOnRails 3) Devise 기본

RubyOnRails 3) Devise 기본


Devise는 User 모델을 손쉽게 만들고 사용할 수 있는 젬이다.


먼저, 젬파일에서 다음의 코드를 기입후 설치해준다.


1
2
3
4
5
\project\Gemfile
 
gem 'devise'
 
$ bundle
cs


그리고 다음의 터미널 명령어를 통해 devise를 설치하고 User 모델을 만든다.


1
2
$ rails g devise:install
$ rails g devise:views (뷰파일 수정할 수 있도록)
$ rails g devise User
cs


그리고 기존의 Post와 Reply 모델에 user_id Column을 추가할 수 있도록 한다.


1
2
3
$ rails g migration add_userid_to_posts user_id:integer
$ rails g migration add_userid_to_replies user_id:integer
$ rails db:migrate
cs



다음, congif/ initializers/ devise.rb 에서 signed_out delete메소드를 get으로 변경한다.

그리고, reply와 마찬가지로 post와 reply 들과 user의 관계를 설정해준다.(belongs_to:user)

그리고, Devise의 Column에 원하는 값들을 추가해주기.


1
2
3
\db\migrate\20181226122057_devise_create_users.rb 의 migrate 파일에 가서 해당 코드 추가
 
t.string :username,              nullfalse, default: ""
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
\app\controllers\application_controller.rb 에 가서 원하는 값 추가
 
class ApplicationController < ActionController::Base
  #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: [:username])
    devise_parameter_sanitizer.permit(:account_update, keys: [:username])
  end
end
 
 
\app\views\devise\registrations\new.html.erb 에 가서 원하는 값 추가
 
<div class="field">
  <%= f.label :username %><br />
  <%= f.text_field :username, autofocus: true, autocomplete: "off" %>
</div>
cs


다음, 각 Controller에 가서 회원을 확인해준다.


1
2
3
4
5
\app\controllers\posts_controller.rb
before_action :authenticate_user!except: [:index, :show]
 
\app\controllers\replies_controller.rb
before_action :authenticate_user!
cs


마지막으로, 추가된 user를 활용하기 위해 controller와 view 파일들을 수정해준다.

Controller 수정


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
\app\controllers\posts_controller.rb
 
def create  
    
    @post = Post.new 
    @post.title = params[:title]
    @post.content = params[:content]
    @post.user_id = params[:user_id]
    @post.save
    
    redirect_to "/posts/index"
end
 
def update
    @post = Post.find(params[:id]) # 해당 Post 객체 찾기
 
    # 같을 경우에만 수정
    if current_user.id == @post.user_id
      @post.title = params[:title]
      @post.content = params[:content]
      @post.save
      
      redirect_to "/posts/show/#{@post.id}"
    else
      redirect_to "/posts/show/#{@post.id}"
    end
end
 
def destroy
   
    @post = Post.find(params[:id]) # 해당 Post 객체 찾기
    # 같을 경우에만 삭제
    if current_user.id == @post.user_id 
      @post.destroy
      redirect_to "/posts/index"
    else
      redirect_to "/posts/index"
    end
end
 
\app\controllers\replies_controller.rb
 
def create
    @reply = Reply.new
    @reply.content = params[:content]
    @reply.post_id = params[:post_id]
    @reply.user_id = params[:user_id]
    @reply.save
     
    redirect_to :back
end
 
def destroy
    @reply = Reply.find(params[:id])
    
    if current_user.id == @reply.user_id
        @reply.destroy
        redirect_to :back
    else
        redirect_to :back
    end
end   
cs


View 파일 수정


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
\app\views\posts\new.html.erb 에서 추가
 
<input type="hidden" name="user_id" value=<%=current_user.id%>></input>
 
\app\views\posts\show.html.erb 에서 댓글 부분에 추가
 
<input type="hidden" name="user_id" value=<%= current_user.id %> ></input>
 
navbar에 해당 내용 추가
 
<if user_signed_in? %>
    <div><%= current_user.email %></div>
    <a href="/users/sign_out">로그아웃</a>
<else %>
    <a href="/users/sign_in">로그인</a>
<end %>
cs


그 외에 작성자 이름을 보여주고 싶은 부분에다가 내용을 편집한다.