2009-08-20 2 views
1

, 그것은 각주에서 이것을 말한다 : 당신 조회 테이블에 (모든)선택 상자에서 테이블 조회 값을 어떻게 얻을 수 있습니까? 민첩한 책 함께 읽기

... 당신은 단순히 선택 도우미에게 과학 차를하고 결과를 전달합니다. 좋아

은 ...

<%= f.select :source, Source.find(:all) %> 

(따라서 테이블) 내 소스 컨트롤러는 다음과 같습니다

:

create_table :sources do |t| 
    t.string :source 

    t.timestamps 
end 

을하지만 내 선택 상자가 엉망이다, 나는 이런 유형의 데이터를 얻을 수 모든 값과 디스플레이에서 :

#<Source:0x23a2bfc> 

그래서 나는 012를 시도했다.그러나 그것은 아직도 나에게 괴상한보고있는 재료를 준다.

내가 뭘 잘못하고 있니?

답변

3
Source.find(:all) 

은 원본 개체의 배열을 반환합니다. 원하는 것은 아닙니다. 원하는 것은 다양한 옵션입니다. 같은 뭔가 :

select(:source, "source_id", Source.all.collect {|p| [ p.source, p.id ] }) 
+0

덕분에, 완벽하게 작동 뷰의 내부 select 방법을 사용하여 질문에 대답합니다. 나는 내가해야 할 일이 있다는 것을 알았다. 콜렉트와 맵의 차이점은 무엇인가? –

+0

차이는 없습니다. 'map'은'collect'의 별명입니다. –

3

당신은 옵션 (또는 키 - 값 옵션)의 컬렉션을 통과해야합니다. select의 세 번째 매개 변수는 실제로 options_for_select 메서드로 전달됩니다. 이것은 예제를 통해 가장 잘 설명됩니다.

options_for_select(["a", "b"]) 

은 ...

<option>a</option><option>b</option> 

은 ... 당신은 키 - 값 쌍

options_for_select([["a", "1"], ["b", "2"]]) 

에 더 관심이있을거야 대부분의 시간

<option value="1">a</option><option value="2">b</option> 
을하게된다

간단히 말해, 전체 수집품을 전달하는 것이 일반적입니다. 물체의 이온을 찾아서 options_for_select이 기대하는 것과 일치하도록 매핑합니다.

options_for_select(Model.all.map { |m| [m.attr1, m.attr2] }) 

... 그리고

<%= f.select(:method, Model.all.map { |m| [m.attr1, m.attr2] }) %> 
+0

설명해 주셔서 감사합니다. 나는 그들이 같은 일을 할 수 있기 때문에 내가 할 수 있으면 나는 대답으로 두 가지를 표시했을 것이다. –