2015-11-23 26 views
0

我想限制我的模型的文本字段中的條目可能性先前定義的陣列模式選擇框。軌形成與一維數據

如何讓我的options_for_select只有一維數組一樣["foo","bar","foobar"]

我試圖

form_for @mappings do |f| 
    f.select(:mapping_type, options_for_select(["foo","bar","foobar"]), class: "..." 

end 

但選擇框出來亂七八糟這樣的:

<select name="section_mapping[mapping_type]" id="section_mapping_mapping_type"> 

,而不是它應該是什麼:

<select name="mapping_type" > 

編輯:

我改變了f.selectselect_tag和形式顯示出來,沒有任何錯誤,但是當我提出它,它離開該字段爲空

編輯2:

f.collection_select(:mapping_type, options_for_select([...]), class: "..."

作品在它正確提交形式與價值,但是HTML類不適用。這是爲什麼?

回答

1

基本上,你希望能夠到您的收藏選擇綁定到對象的屬性(在你的情況,@mappings

此外,從文檔上rails collection_select,它會選擇如下:

collection_select(對象,方法,收集,value_method,text_method,選項= {},html_options = {})公共

  • Objet公司:對象要在這種情況下,結合所選擇的選項(@mappings [f])
  • 方法:對象的屬性/屬性(在這種情況下,mapping_type
  • 集合:的選擇(["foo","bar","foobar"]
  • value_method收集:以後要送回來的提交(注意,這是一個method這意味着你應該能夠調用它的對象。)更多關於這方面的價值。
  • text_method:要顯示爲上視圖中選擇選項的文本值(這也是一種方法如上,以後會更多也)
  • 選項:任何你想要的附加選項,(例如:include_blank
  • html_options:例如:id,class

就着value_methodtext_method,這些都是應該在你的collection被調用,這意味着您的收藏將成爲對象的數組方法。

爲此,你可以有以下幾種:

class CollectionArr 
    include ActiveModel::Model 

    attr_accessor :name 
    ARR = [ 
    {"name" => "foo"}, 
    {"name" => "bar"}, 
    {"name" => "foobar"} 
    ] 

    def self.get_collection 
    ARR.collect do |hash| 
     self.new(
     name: hash['name'] 
    ) 
    end 
    end 
end 

從這裏,呼籲CollectionArr.get_collection將返回對象的數組,你可以CAL .name返回要麼foobarfoobar。這使得使用collection_select易交易從這裏:

<%= f.collection_select : mapping_type, CollectionArr.get_collection, :name, :name, {:include_blank => "Select one"} %> 

而且都是綠色...

+0

哇感謝這麼多。這解決了我的問題,並且我學到了一件很酷的東西。你能否包含一個指向文檔的鏈接來解釋self.get_collection方法的內容,特別是self.new()的作用。 – Killerpixler

+0

嗯,我寫了這個方法......但這裏的關鍵是'collect'循環給定的數組,'self.new'創建一個'CollectionArr'類的新實例。 –

+0

希望你的問題得到解答? –