Computer Engineering/ruby on rails

[ruby on rails] 히스킨 클론 코딩 4 - 장바구니 기능

soohey 2022. 6. 7. 01:40

루비레일즈 클론코딩 영상 리뷰입니다..:)

기억하고 싶은 부분만 슥삭 메모했습니다.

https://www.youtube.com/watch?v=lHRt8TsvQbo 

 

 

pack_controller.rb index 액션 수정하기

publish인 상태만 게시판에서 보일 수 있도록 수정해주어야 한다.

def index
    //@packs = Pack.all
    @packs = Pack.published
end

 

pack 모델 더미 데이터 추가하기

  • app>models>pack.rb 에 self.set_dummy_datas를 생성
  • 20.times를 통해 20번의 create 반복이 가능하다.
  • faker gem을 활용해 random으로 product_name을 생성한다.

https://github.com/faker-ruby/faker

 

GitHub - faker-ruby/faker: A library for generating fake data such as names, addresses, and phone numbers.

A library for generating fake data such as names, addresses, and phone numbers. - GitHub - faker-ruby/faker: A library for generating fake data such as names, addresses, and phone numbers.

github.com

//gemfile

gem 'faker', :git => 'https://github.com/faker-ruby/faker.git', :branch => 'master'
//pack.rb

def self.set_dummy_datas
    20.times do
   // 20번 동안 Pack 더미 생성
       Pack.create(
          product_name: Faker::Superhero.unique.name ,  //unique 사용시 중복제거하여 새로운 name 생성함.
          company_name: Faker::Superhero.unique.power ,
          price: [1000, 2000, 3000].sample  // 랜덤 선택
    end
end

rails console 실행하기

rails c
Pack.set_dummy_datas

 

 

장바구니 모델 설계

rails g model Cart user:references pack:references quantity:integer
// *_create_carts.rb

def change
   create_table :carts do |t|
      t.references :user, foreign_key: true
      t.references :pack, foreign_key: true
      t.integer :quantity, default: 1   // 장바구니 수량 기본값 설정

      t.timestamps
   end
end
      

 

 

모델 관계 설정

//app>models>user.rb

has_many :carts, dependent: :destory
has_many :packs, through :carts
//app>models>pack.rb

has_many :carts, dependent: :destory
has_many :users, through :carts

 

기능설계

routes 설정하기

//routs.rb

resources :carts, only: [:create]

 

packs show 페이지 수정하기(장바구니 폼 만들기)

  • show.html에 form페이지 만들기
  • carts controller에 pack_id, user_id, quantity를 생성하는 create 액션 생성하기
  • pack_id를 넘겨주기
#packs > show.html

<form action="/carts" method="POST">
	<%= hidden_field_tag :authenticity_token, form_authenticity_token %>
   
   	<input type="hidden" name="pack_id" value="<%= @pack.id %>">
    #pack_id 가져오기
    
    <div class="form-group">
    <label for="quantity">수량</label>
    <input type="number name="quantity" value="1" min="1" max="10">
    </div>
    
    <button type="submit" class="btn btn-outline-dark">장바구니 등록</button>
    
    
</form>

 

rails g controller carts create
#CartsController

before_action :authenticate_user!
#모든 액션은 사용자가 로그인했을때만 실행

def create
	Cart.create(
    	pack_id: params[:pack_id],
        user_id: current_user.id,
        quantity: params[:quantity]
    )
    
    redirect_back(fallback_location: root_path)
end

 

 

cart  어드민 생성하기

rails g active_admin:resource user
rails g active_admin:resource cart
  • cart를 특정 사용자의 장바구니가 되도록 설정해주어야 한다.
  • belongs_to를 통해 users 설정해주면 루트가 자동으로 생성된다.
#app>admin>carts.rb

belongs_to :user
/admin/users/:user_id/carts   #route 자동 생성

 

 

user 어드민 장바구니 기능 연결

  • user 모델
  • user의 장바구니의 유무를 알리는 칼럼을 추가한다.
  • 특정 사용자이 장바구니로 가는 a 링크를 생성한다.
  • cart 모델
  • 카트에 담긴 가격의 총 합을 보여주는 칼럼을 추가한다.
#app>admin>users.rb

ActiveAdmin.register User do

index do
        selectable_column
        id_column

        column :email

        #user의 장바구니의 유무를 알리는 칼럼
        column "장바구니 유무" do |user|
            user.carts.present?
        end

        #특정 사용자의 장바구니로 가는 루트를 생성
        actions do |user|
            a "장바구니 확인", href: "/admin/users/#{user.id}/carts"
        end
    end
end
#app>admin>carts.rb

ActiveAdmin.register Cart do
   
   belongs_to :user
   index do
    
        
        selectable_column
        id_column

        column :pack
        column :quantity
        column "총 합" do |cart|
		    number_to+currency(cart.pack.price * cart.quantity)
        end

        actions
        
    end
end