rails select form을 알아보자

Posted by negabaro kim on Wednesday, May 20, 2020 Tags: rails   3 minute read

rails view template에서 자주사용하는 select form에 대해 알아보자.

select

form_for,form_with에 의존해서 폼을 작성하는게 특징 덕분에 신규와 수정화면에 같은 코드로 정의 가능해서 CRUD폼 작성시 매우용이

기본문법은 이하와 같다.

form_with mode: xx, url: xx_path do |f|
  f.select( 프로퍼티명, 태그정보, {옵션}, {HTML옵션} )

프로퍼티명: 컬럼명

form_for에서는 프로퍼티명 = DB컬럼명으로 강제되어서 일치하지 않을시 에러가 나곤 했었는데 form_with에서는 컬럼명을 자유롭게 지정할 수 있어서 자유도가 높아졌다.

태그정보: 셀렉트박스 표시에 사용하는 값을 넣는다 배열/해쉬 만 가능

실제 렌더링시 option값에 해당하는 부분

select
 option

태그정보의 문법은 배열일 경우와 해쉬일 경우 각각 아래와 같다.

배열일 경우

[[ 외부 1, 내부 1 ], [ 외부 2, 내부 2 ]]

해쉬일 경우

{ "외부값1" => "내부값1", "외부값2" => "외부값2" }

옵션: 셀렉트박스의 옵션(include_blank나selected등)

공식적인 select dom의 옵션등을 여기에 지정 include_blank,selected 외에 써본적은 없음

HTML옵션: HTML의 옵션(id,class등)

id,class이외에도 제약없이 자유럽게 넣어줄 수 있음 vue template으로 rails의 view를 사용시 vue의 옵션들을 여기에서 지정해줌(v-model,v-on:change)

사용 예제

필자가 현업에서 사용한 예제를 몇개 살펴보자.

사용 예제1(프로퍼티명과 태그정보만 사용)

#slim                         
= f.select :system_id, User.all.select(:system_id).map{|v|v.system_id}

옵션,HTML옵션은 필수가 아니라는걸 알 수 있다.

사용 예제2(옵션과 HTML옵션 사용)

HTML옵션에서는 vue에서 컨트롤하기 위한 옵션등을 넣었다.

#slim
= f.select :year, @items.map{|a| ["#{a[:year]}年度", a[:year]] }, {selected: session[:ro_year]},  {'v-model': 'year', 'v-on:change': 'onChange'}

사용 예제3(자주 헤매는 부분)

오류가나는 예제

#slim
= f.select :game_master_id, @game_masters.map{|m| [m.name, m.id] }, {id: 'xx'}

오랜만에 select form사용시 항상 오류가 나는 부분인데 html,html옵션은 정의 순서로 판단하므로 html옵션만 쓰고 싶다고 그것만 정의하면 html옵션 부분을 옵션으로 인식해서 존재하지 않는 옵션이라 에러가 발생함

알맞은 예제

#slim
= f.select :game_master_id, @game_masters.map{|m| [m.name, m.id] }, {}, {id: 'xx'}

알맞은 예제는 사용하지 않는 옵션은 {}로 정의해줘야함.

<%= f.select :sex, {'男性': 1, '女性': 2}, { include_blank: '選択してください'}, { class: 'form-control' , required: true } %>

reference:

https://310nae.com/rails-selectbox/