누군가가 collection_select를 명확하고 간단한 용어로 설명 할 수 있습니까?


146

Rails API 문서를 살펴보고 신기합니다 collection_select.

제목은 다음과 같습니다.

collection_select(object, method, collection, value_method, text_method, options = {}, html_options = {})

그리고 이것이 그들이 제공하는 유일한 샘플 코드입니다 :

collection_select(:post, :author_id, Author.all, :id, :name_with_initial, :prompt => true)

누군가 간단한 연결 ( Userhas_many Plans및 a에 Plan속함 User)을 사용하여 구문에서 사용하고 싶은 이유와 이유를 설명 할 수 있습니까?

편집 1 : 또한 form_helper일반 양식이나 내부 양식이 어떻게 작동하는지 설명하면 멋질 것 입니다. 웹 개발을 이해하지만 Rails의 '상대적으로 새로운'웹 개발자에게 이것을 설명한다고 상상해보십시오. 어떻게 설명하겠습니까?


50
예. 그것은 내가 본 것 중 가장 끔찍한 문서입니다
Jaseem

1
공평하게 말하면 , 문서는 상당히 괜찮 FormBuilder습니다 FormOptionsHelper. api.rubyonrails.org/classes/ActionView/Helpers/…
amiuhle

1
내가 가장 좋아하는 부분은 form에서 collection_select를 사용하고 객체가 매개 변수 목록의 일부가 아닌 대신 collection_select가 객체의 메소드로 호출되도록 전체 서명을 변경하는 것입니다. 그들이 문서에서 그것을 언급하지 않는다고 생각합니다.
user3670743

1
이것은 오픈 소스 프로젝트입니다. 문서가 열악한 경우에는 우리 자신 만이 책임이 있습니다. 우리가 더 잘하기 위해 조금만 노력한다면 놀라운 일이 될 수 있습니다. 작고 단순한 PR은 먼 길을갑니다.
BKSpurgeon

답변:


305
collection_select(
    :post, # field namespace 
    :author_id, # field name
    # result of these two params will be: <select name="post[author_id]">...

    # then you should specify some collection or array of rows.
    # It can be Author.where(..).order(..) or something like that. 
    # In your example it is:
    Author.all, 

    # then you should specify methods for generating options
    :id, # this is name of method that will be called for every row, result will be set as key
    :name_with_initial, # this is name of method that will be called for every row, result will be set as value

    # as a result, every option will be generated by the following rule: 
    # <option value=#{author.id}>#{author.name_with_initial}</option>
    # 'author' is an element in the collection or array

    :prompt => true # then you can specify some params. You can find them in the docs.
)

또는 예제는 다음 코드로 표현할 수 있습니다.

<select name="post[author_id]">
    <% Author.all.each do |author| %>
        <option value="<%= author.id %>"><%= author.name_with_initial %></option>
    <% end %>
</select>

이것은에 문서화되어 있지 FormBuilder않지만FormOptionsHelper


32
이것은 내가 본 복잡한 Rails 구조에 대한 가장 좋은 설명 중 하나입니다. 기본 Rails 구문과 함께 명확한 언어를 사용하여 언어를 강화했습니다. 고맙습니다!!
marcamillion

2
왜 "post [author_id]"라는 이름을 지정 하시겠습니까?
Jaseem

@alexkv 감사합니다 : : post, # field namespace 및 : author_id, # field name 매개 변수 (처음 두 개)의 중요성에 대해 자세히 설명 할 수 있습니까-나는 사물의 계획에서 그들의 목적을 이해하지 못합니다. 그들은 생략됩니까?
BKSpurgeon

1
첫 번째 매개 변수는 실제로는 없을 수 있습니다. 객체 양식을 작성하는 경우 해당 객체가 선택되어 나머지 양식과 동일한 이름 공간이 선택됩니다. 필요하지 않으면 1을 nil로 두십시오. 두 번째는 컨트롤의 이름이므로 개체의 첫 번째 필드 (첫 번째 매개 변수)를 업데이트하는 경우 필드 이름이 두 번째 매개 변수입니다. 다른 용도로 양식을 작성하는 경우 두 번째 매개 변수는 양식 제어의 이름을 지정하고 id를 지정하는 것입니다. 왜 nil 1로 이것을 사용합니까? : prompt 옵션에 collection_select를 원하기 때문일 수 있습니다.
elc

1
또한 options_for_select를 사용하는 select_tag에 대해 프롬프트 매개 변수를 사용하는 것과 동일한 효과를 얻을 수 있습니다. 이는 nil 객체로 collection_select와 동일하게 응답 할 수 있습니다.
elc

21

나는 select 태그의 순열에 꽤 많은 시간을 보냈다.

collection_select객체 컬렉션에서 select 태그를 작성합니다. 이것을 명심하고

object: 객체의 이름입니다. 태그 이름을 생성하는 데 사용되며 선택한 값을 생성하는 데 사용됩니다. 실제 객체이거나 심볼 일 수 있습니다. 후자의 경우 해당 이름의 인스턴스 변수 는 바인딩에서 찾을 수 있습니다ActionController (즉, 컨트롤러에서 :post호출 @post된 인스턴스 var를 찾습니다 ).

method: 메소드 이름. 태그의 이름을 생성하는 데 사용됩니다. 즉, 선택에서 가져 오려는 객체의 속성

collection : 객체 모음

value_method : 콜렉션의 각 오브젝트에 대해이 메소드는 값에 사용됩니다.

text_method : 컬렉션의 각 개체에 대해이 방법은 텍스트를 표시하는 데 사용됩니다

선택적 매개 변수 :

options: 전달할 수있는 옵션. 여기 에는 옵션 제목 아래에 설명되어 있습니다 .

html_options: 여기에 전달 된 것은 생성 된 html 태그에 추가됩니다. 클래스, id 또는 다른 속성을 제공하려면 여기로 이동하십시오.

협회는 다음과 같이 작성할 수 있습니다.

collection_select(:user, :plan_ids, Plan.all, :id, :name, {:prompt => true, :multiple=>true })

예를 들어 form_for에 포함 된 모든 태그에 대해 다시 매우 간단한 용어 로을 사용하는 것과 관련하여 form_for. f.text_field첫 번째 ( object) 매개 변수 를 제공 할 필요는 없습니다 . 이것은 form_for구문 에서 가져옵니다 .


2
시간을 내 주셔서 감사합니다 ...하지만 유일한 문제는 모든 정직에서 당신의 설명이 내 머릿속을 명확히하는 데 도움이되지 않습니다. 실제 정의에서 많은 용어를 사용했습니다. 그래도 시간을 내 주셔서 감사합니다-그래서 그것을 위해 투표했습니다.
marcamillion

4
marcamillion에 의해 그렇게 명확하게 언급 된 이유로, 나는 그것을 표결했다.
Jamie
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.