Computer Engineering/ruby on rails

[ruby on rails] 히스킨 클론 코딩 3 - vaildation 처리

soohey 2022. 6. 7. 00:37

유튜브 강의의 영상리뷰입니다.

두서없이 작성해보았습니다.. :)..

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

 

 

user 칼럼 추가하기

 

$ rails g migration add_cols_to_users name:string address:string post_code:string
$ rails db:migrate

 

 

validation 유효성 검사 추가하기

 

class Person < ApplicationRecord
  validates :name, length: { minimum: 2 }
  validates :bio, length: { maximum: 500 }
  validates :password, length: { in: 6..20 }
  validates :registration_number, length: { is: 6 }
end
  • length로 최대, 최소, 길이를 조절할 수 있음. 
  • minimum : 최소값 지정하기
  • maximum : 최대값 지정하기
  • in : 6~20
  • is : 해당 크기만 허용

 

유효성 검사가 잘 됐는지 확인해보기

rails c
User.create(email: "2@2", password:"111111", phone:"01011112222", post_code:"00000")

 

validates 처리 시 주의 사항

validates 처리시 입력을 필수적으로 해야한다. 값이 없을때만 is가 동작하도록 처리가 필요함

class User < ApplicationRecord
     validates :phone, length: { is: 11 }, allow_nill: true
     validates :post_code, length: { is: 5 }, allow_nill: true
end

allow_nill: true로 null값을 허용해주면 값이 저장된다.

 

Pack 컬럼 상상하기

가격, 수량, is_publish칼럼 추가하기

rails g migration add_cols_to_packs price:decimal is_publish:boolean 

 

db>migration 파일로 들어가서 방금 생성한 칼럼의 is_publish의 기본값을 true로 설정

add_column :packs, :is_publish, :boolean, default: true

이후 rake db 해주기

rake db:migrate

 

 

app>model> Pack 칼럼 validation 처리하기

  • 팩 이미지, 네임, 가격이 필수적이기 때문에 처리해주기
  • boolean의 경우 exclusion을 이용해 nill값을 못받도록 처리하기
class Pack < ApplicationRecord
     validates :product_name, :company_name, :price, presence: true
     validates :is_publish, exclusion: [nil]
end

 

app>admin> Pack 어드민 수정하기 (form, ko.yml)

  • is_publis 추가하기
  • admin 페이지에서 number_to_currency로 price 1,000원 형태로 출력하기

 

index do
    selectable_column
    
    id_column

    column :image do |pack|
       if pack.image.attached?
          image_tag url_for(pack.image), class: "small_img"
       else
          "이미지 없음"
       end
    end
    column :product_name
    column :company_name
    column :price do |pack|
       number_to_currency(pack.price)    //ex) 1,000원 출력
    end

    column :is_publish   //admin 페이지에 보이게 함

    actions
end

form do |f|
    f.inputs do
       f.input :image, as: :file
       f.input :product_name
       f.input :company_name
       f.input :desc
       f.input :price, hint: "실제 판매 가격을 입력해주세요"
       f.input :is_publish
    end
    f.actions
end

 

app>models> Pack 모델 scope 기능 추가하기

publish 범위를 수정하는 기능을 scope라고 한다.

class Pack < ApplicationRecord
    has_one_attached :image

     validates :product_name, :company_name, :price, presence: true
     validates :is_publish, exclusion: [nil]

    scope :published, -> { Pack.where( is_publish: true) }
    scope :unpublished, -> { Pack.where( is_publish: false) }
end

rails console에서 확인해보기

rails c
Pack.published     //공개처리
Pack.unpublished    //비공개처리

 

app>admin> pack.rb admin페이지에서 scope확인할 수 있도록 추가하기

ActiveAdmin.register Pack do

    scope :all
    scope -> {"공개"}, :published, default: true
    scope -> {"비공개"}, :unpublished

 

 

app>admin> Pack 어드민 배치 액션 추가하기

데이터가 방대할 경우 여러개의 데이터를 한번에 비공개/공개처리하는 액션을 추가해주어야 한다.

ids는 Pack의 id를 의미한다.

 

index do
....
end

//controller 부분을 짠다고 생각하면 됨
bach_action :publish do |ids|
    @packs = Pack.where(id: ids)
// 선택된 pack들의 id를 받아서 각각 true 처리를 해준다.
    @packs.each do |pack|
       pack.update(is_publish: true)
    end

    flash[:notice] = "마스크 팩이 공개처리 되었습니다."    //공개처리했을때만 알림
    redirect_back(fallback_location: root_path)    //새로고침시 redirect_back
end

bach_action :unpublish do |ids|
    @packs = Pack.where(id: ids)
     // 선택된 pack들의 id를 받아서 각각 false 처리를 해준다.
    @packs.each do |pack|
       pack.update(is_publish: false)
    end

    flash[:notice] = "마스크 팩이 비공개처리 되었습니다."    //공개처리했을때만 알림
    redirect_back(fallback_location: root_path)    //새로고침시 redirect_back
end



form do |f|
....