/rails_asked

rails로 활용

Primary LanguageRuby

ASKED : rails new asked / rails s -b 0.0.0.0

  • posts 컨트롤러 rails g controller posts index new create show edit update destroy

    • index

      • 모든 것을 보여준다.
    • Create : new create

      • new

        form을 보여준다.

      • create

        • form 데이터를 받는다. (params)
        • Post에 Create 한다.
    • Read : show

      • Post 중에 하나를 선택한다.
    • Update : edit update

      • edit

        form을 보여준다

      • update

        • form 데이터를 받는다. (params)
        • Post 중에 하나를 선택한다.
        • update한다.
    • Delete : destroy

      • Post 중에 하나를 선택한다.
      • 삭제한다.
  • users 컨트롤러 rails g controller users index new create

  • post 모델 rails g model post username:string title:string content:text

    • string username
    • string title
    • text content
  • user 모델

    • string username
    • string email
    • string password
# config/routes.rb
# index
get 'posts' => 'posts#index'
# CRUD - C
get 'posts/new' => 'posts#new'
post 'posts' => 'posts#create'
# CRUD - R
get 'posts/:id' => 'posts#show'
# CRUD - U
get 'posts/:id/edit' => 'posts#edit'
put 'posts/:id/' => 'posts#update'
# CRUD - D
delete 'posts/:id' => 'posts#destroy'
resources :posts
  • REST API를 구성하는 기본 원칙
    1. URL은 정보의 자원을 표현한다.
    2. 자원에 대한 행위는 HTTP method(verb)로 표현한다.

form에서 post 요청 보내기

<!-- app/views/posts/new.html.erb -->
<form action="/posts" method="post">
    ..
    <input type="hidden" name="authenticity_token" value="<%= form_authenticity_token %>">
    ..
</form>
# app/controllers/application_controller.rb
protect_from_forgery with: :exception
  • form post 요청에서 token이 없으면, 오류가 발생함. 토큰을 사용하는 이유는 CSRF 공격을 방지하기 위해서임.

put, delete 요청 보내기

<!-- app/views/posts/edit.html.erb -->
<form action="/posts/<%=@post.id%>" method="post">
    ..
    <input type="hidden" name="_method" value="put">
    <input type="hidden" name="authenticity_token" value="<%= form_authenticity_token %>">
    ..
</form>
<a href="/posts/<%=@post.id%>" data-method="delete" data-confirm="정말 삭제할래?">삭제하기</a>
  • 1:多 (1:N)

    User(1) - Post(N) 관계 설정.

    유저는 많은 게시글을 가지고 있고, 게시글은 특정 유저에 속하기 때문.

  • 실제 코드 적용

    1. 객체 관계 설정
    # app/model/user.rb
    class User < ActiveRecord::Base
        has_many :posts
    end
    # app/model/post.rb
    class Post < ActiveRecord::Base
        belongs_to :user
    end
    1. 데이터베이스 관계 설정 -> rake db:migrate

      # db/migrate/20180625_create_posts.rb
      ..
      	t.string :title
      	t.text :content
      	t.integer :user_id  # Foreign key
      #   t.reference :user_id
      ..
  • 실제로 관계를 활용하기

    1. 유저가 가지고 있는 모든 게시글
    # 1번 유저의 모든 글
    @user_posts = User.find(1).posts
    # 그 사람이 쓴 글의 갯수
    User.find(1).posts.count
    1. 특정 게시글에서 작성한 사람 정보 출력
    # 1번 글의 유저 작성자 이름
    Post.find(1).user.username

login

# app/controllers/sessions_controller.rb
def new # get '/login'
end

def create # post '/login'
    #로그인 성공시
   session[:user_id] = id
end

def destroy # get '/logout'
   session.clear 
end

before filter : 컨트롤러

# app/controllers/posts_controller.rb
# authorize 메소드를 실행하는데, 여기 모든 액션 중에 index를 제외하고 실행
before_action :authorize, except: [:index]
# app/controllers/application_controller.rb
def authorize
   unless current_user
       flash[:alert] = "로그인 해주세요"
       redirect_to '/'
   end
end

helper method

# app/controllers/application_controller.rb

# view에서도 활용가능한 메소드로 만드는 법
helper_method :current_user

def current_user
   # @user에 값이 있으면, 디비에 쿼리를 날리지 않는다.
   @user ||= User.find(params[:id]) if session[:user_id]
end
  • 뷰에서 활용

    <% if current_user %>
    	<p><%= current_user.username %></p>
    	<a href="/logout">로그아웃</a>
    <% else %>
    	<a href="/login">로그인</a>
    	<a href="/signup">회원가입</a>
    <% end %>