【초보자용】form_with, haml, enum을 사용해 select에 의한 풀다운 리스트를 만든 이야기 [Rails]
소개
안녕하세요. 엔지니어 목표로 수행중인 너구리입니다.
form은, view와 데이타베이스와의 교차하는 점이므로, 여러가지 기술이 어렵지요.
이번에는, select에 의한 풀다운 리스트를 구현하는데 있어서, 여러가지 시행착오를 했으므로, 자신의 비망을 위해서도 기록을 남겨 두려고 생각합니다.
데이터베이스 및 데이터 유형 정보
전제로서, 지금, 레스토랑 정보를 등록하는 먹어 로그와 같은 사이트를 만들고 있습니다.
테이블 이름은 restaurants입니다.
낮 예산, "budget_d"의 항에 대해 select에서 옵션을 선택할 수 있도록하고 싶습니다.
먼저 restautrants 테이블에 budget_d 열을 만들고 거기에 integer 형식으로 데이터를 넣습니다.
# migrationファイル
class AddColumnToRestaurant < ActiveRecord::Migration[5.2]
def change
add_column :restaurants, :budget_d, :integer, default: 0
end
end
우선 기본 HTML
form 태그의 select 태그를 이용한 기본 HTML은 이런 형태가 됩니다.
# view
<select name="budget_d">
<option value="0">--</option>
<option value="1">¥~999</option>
<option value="2">¥1,000~¥1,999</option>
<option value="3">¥2,000~¥2,999</option>
<option value="4">¥3,000~</option>
</select>
그것을 haml로 작성해보십시오.
그것을, haml로 쓰면 이런 느낌. 이하, haml로 기재해 갑니다.
# view
%select{:name => "budget_d"}
%option{:value => "0"} --
%option{:value => "1"} ¥~999
%option{:value => "2"} ¥1,000~¥1,999
%option{:value => "3"} ¥2,000~¥2,999
%option{:value => "4"} ¥3,000~
그리고 form_with로 작성해 봅시다.
그리고 이것을 form_with를 사용하여 쓰면 이런 느낌.
# view
= form_with model: @restaurant, local: true do |f|
= f.select :budget_d, [["--", 0],["¥~999", 1],["¥1,000~¥1,999", 2],["¥2,000~¥2,999",3],["¥3,000~",4]]
[["key", "value"], ["key", "value"]... ]
그리고 배열의 왼쪽에 키 (옵션으로 표시하는 값)가 오른쪽에 가치 (데이터베이스로 보내는 값) 표시되고 풀다운 목록 선택이됩니다.
간단한 구현으로 좋으면 이제 선택한 내용을 데이터베이스에 등록할 수 있습니다.
여담(1)
form_with는 기본적으로 view에 JavaScript를 호출하기 때문에,
HTML을 호출하고 싶은 경우에는 local: true가 필요하다고 합니다.
여담(2)
클래스 속성은 제3 인수가 아니면 넣을 수 없기 때문에, 만약 select_box에 클래스를 지정하고 싶을 때에는, 다음과 같이 씁니다.
= f.select :budget_d, [ ここに配列が入ります ], {}, {class: "クラス名"}
enum을 사용하여 사용하기 쉽습니다.
게다가 이것을 enum을 사용해, 사용하기 쉽고, 메인터넌스 하기 쉽게 쓰면 이런 느낌이 됩니다.
enum을 사용하면 if budget_d.default?와 같은 메소드도 사용할 수 있습니다.
# view
= f.select :budget_d, options_for_select(Restaurant.budget_ds.keys)
#model
enum budget_d: {
default: 0,
till_1000: 1,
till_2000: 2,
till_3000: 3,
over_3000: 4,
}, _prefix: true
이 때, haml 쪽에서 「budget_ds」라고 복수형이 되어 있는 것이 포인트입니다.
options_for_select는 배열을 찾는 메소드이므로 복수형이 아니면 잘 인식되지 않습니다.
글쎄, 이제 무사히 풀다운 목록의 내용이 표시됩니다 (해야) ...입니다. . .
여기까지의 트라이 앤 에러, 여러가지 길었습니다. . . . .
enum의 일본어화
그러나 이야기는 여기서 끝나지 않습니다. . .
실은, 이대로라면 리스트의 옵션 및 여러가지 뷰로 enum에 설정한 값이 영어로 표시됩니다.
(아래 그림 참조)
그래서 enum을 일본어화할 필요가 있습니다. . . . 여기서 쓰면 매우 장문이 되어 버리기 때문에, 그것은 또 회를 다시 소개하고 싶습니다. . .
form은 뭔가 힘들지만 시행착오한 덕분에 조금 좋아하게 되었습니다♪
끝까지 읽어 주셔서 감사합니다 ^^
추신
그 후, enum을 일본어화한 기사는, 이쪽에 투고하고 있습니다.
【초보자용】i18n을 이용하여 enum의 f.select 옵션을 일본어화한다[Rails]
Reference
이 문제에 관하여(【초보자용】form_with, haml, enum을 사용해 select에 의한 풀다운 리스트를 만든 이야기 [Rails]), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/tanutanu/items/1bb5f12ac8ae90e71352
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
# migrationファイル
class AddColumnToRestaurant < ActiveRecord::Migration[5.2]
def change
add_column :restaurants, :budget_d, :integer, default: 0
end
end
# view
<select name="budget_d">
<option value="0">--</option>
<option value="1">¥~999</option>
<option value="2">¥1,000~¥1,999</option>
<option value="3">¥2,000~¥2,999</option>
<option value="4">¥3,000~</option>
</select>
# view
%select{:name => "budget_d"}
%option{:value => "0"} --
%option{:value => "1"} ¥~999
%option{:value => "2"} ¥1,000~¥1,999
%option{:value => "3"} ¥2,000~¥2,999
%option{:value => "4"} ¥3,000~
# view
= form_with model: @restaurant, local: true do |f|
= f.select :budget_d, [["--", 0],["¥~999", 1],["¥1,000~¥1,999", 2],["¥2,000~¥2,999",3],["¥3,000~",4]]
= f.select :budget_d, [ ここに配列が入ります ], {}, {class: "クラス名"}
# view
= f.select :budget_d, options_for_select(Restaurant.budget_ds.keys)
#model
enum budget_d: {
default: 0,
till_1000: 1,
till_2000: 2,
till_3000: 3,
over_3000: 4,
}, _prefix: true
Reference
이 문제에 관하여(【초보자용】form_with, haml, enum을 사용해 select에 의한 풀다운 리스트를 만든 이야기 [Rails]), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tanutanu/items/1bb5f12ac8ae90e71352텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)