2012-12-31 97 views
7

多個值,我想有以下HTML代碼在我的表格:爲collection_select

<select name="user[language_ids][]"> 
    <option value="">Please select</option> 
    <option value="1" selected="selected">English</option> 
    <option value="2">Spanish</option> 
    </select> 

    <select name="user[language_ids][]"> 
    <option value="">Please select</option> 
    <option value="1" selected="selected">English</option> 
    <option value="2">Spanish</option> 
    </select> 

,以允許用戶選擇兩種語言時,他報名參加。

我試圖用這樣的:

<%= f.label :languages %> 
<%= f.collection_select(:language_ids, Language.all, :id, :name) %> 
<%= f.collection_select(:language_ids, Language.all, :id, :name) %> 

而且也與此:

<%= f.label :languages %> 
<%= f.collection_select(:language_ids[], Language.all, :id, :name) %> 
<%= f.collection_select(:language_ids[], Language.all, :id, :name) %> 

revieweing的答案後,我試圖用這樣的:

<%= collection_select(:user, :language_ids, Language.all, :id, :name, {}, {:name => 'user[language_ids][]' }) %> 
    <%= collection_select(:user, :language_ids, Language.all, :id, :name, {}, {:name => 'user[language_ids][]' }) %> 

但問題這裏是兩個選擇具有相同的ID,並且它們也不與表單構建器相關聯

有關最佳方式的任何想法?

+0

你看到的語言,而不是他們的名字show.html.erb的ID? – uday

+0

選擇字段與模型有什麼關係? –

回答

5

嘗試,

<%= f.collection_select(:language_ids, Language.all, :id, :name,{}, {:multiple => true}) %> 
+0

我不想多,我想幾個選擇...謝謝雖然 –

+1

不爲問題的正確答案,只是因爲我正確的答案,這樣的感謝! –

1

試試這個:

<%=select_tag "language_ids[]" options_for_select([['Please select','']]+Language.all.map{|ln|[ln.name,ln.id]})%> 
+0

這只是做collection_select的另一種方法。不解決作者的問題 – JustBasti

1

你應該能夠做這樣的事情:

<%= f.label :languages %> 
<%= f.collection_select(:language_ids, Language.all, :id, :name, {}, {id => "language_1", :name => "user[language_ids][]"}) %> 
<%= f.collection_select(:language_ids, Language.all, :id, :name, {}, {id => "language_2", :name => "user[language_ids][]"}) %> 
0

基本上發送2(或更多)的字段相同的屬性不起作用,因爲params會變成散列:{language_ids: [1], language_ids: [2]}並且由於您擁有相同的密鑰la st one將覆蓋前一個(s)。

{a: 1, a: 2}[:a] #=> 2 

爲了規避這個問題,您需要創建不同的屬性,然後將它們連接在一起。爲此,您將需要門面屬性在你的模型:

class Language 
    attr_writer :language_one_id, :language_two_id 

    before_save :gather_languages 

    def gather_languages 
    self.language_ids= [language_one_id, language_two_id] 
    end 

    # for the form to display chosen lang (idem with two) 
    def language_id 
    language_ids.first 
    end 
end 

# view/_form 
=f.select :language_one_id, Language.all.map {|l| [l.name, l.id]} 
=f.select :language_two_id, Language.all.map {|l| [l.name, l.id]} 

但坦率地說,我認爲你是讓你的生活更加努力以違背約定在這裏(我使用複選框來代替)。

0

您可以在表格中添加「second_language」列,然後使其具有與第一語言列相同的內容。

0

您可以使用fields_for這樣的:

<%= form_for @user do |f| %> 
... 
<h2>Languages</h2> 
<%= fields_for :languages do |lang_form| %> 
    <%= lang_form.collection_select :language_id, Language.all, :id, :name %> 
<% end %> 
.. 
<% end %> 

在你的控制器,在新的或修改的方法,你可以做到這一點,接受2種語言

2.times { @user.languages.build } 
0

首先你要的編輯您的用戶模型:

user.rb

has_many :languages 
accepts_nested_attributes_for :languages 

下生成模式:

$> rails g model language user_id:integer name 

語言。RB

belongs_to :user 

users_controller.rb(可能在 '新' 行動)

2.times do 
    language = @user.language.build 
end 

_form.html.erb

<%= form_for @user do |f| %> 
    <%= f.fields_for :languages do |lang| %> 
    <%= lang.label :name, "Name" %><br /> 
    <%= lang.select :name, Language.all.collect {|l| [l.name, l.id]}, prompt: 'Please select' %><br /> 
    <%= end %>  
    <p><%= f.submit "Submit" %></p> 
<% end %> 
0

既然你在寫了 「用戶[language_ids] []」你選擇的名稱屬性,我不得不假設你想要一個多選框。你應該這樣做:

f.collection_select (:language_ids, Language.all, :id, :name, 
{:prompt => true}, {:multiple => true}) 

當然沒有一個很好的記錄功能。

編輯:在您的例子進一步尋找和一些問題的答案,我想指出的幾件事情:

  • 你舉的例子有提示「請選擇」的選擇框的第一個選項,但你要英語在您的兩個例子是「選擇。如果你要預先選擇一個選項,它還有選擇框的第一個選項,那你爲什麼有提示選項?人使用它強制用戶進行選擇的東西。

  • 您在您要多選擇,而不是多個選擇,REA一個答案寫兒子爲什麼你不想要:multiple =>真正的解決方案。我仍然建議你使用它,但也許你確實有一個必要的用例。因此,我建議你直接使用select_tag幫助(我不認爲你會實現與表單標籤傭工):

    select_tag "user[language_ids][]", 
    options_from_collection_for_select(Language.all, "id", "name"), 
    :prompt => true, :id => "user_language_ids" 
    

    這裏的關鍵是,在多發選擇必須有不同的ID,這你必須明確地通過,所以它會在你手上。

3

您可以通過使用 fields_for創建字段的集合。
兩個選擇將具有相同的ID,但 collection_select 有一個可選的哈希containings HTML選擇,您可以設置自定義ID。

<%= f.fields_for :language_ids do |language| %> 
    <%= language.collection_select(nil, Language.all, :id, :name, 
     {include_blank: "Please select", selected: 1}, 
     {id: :user_language_id_1}) %> 
    <%= language.collection_select(nil, Language.all, :id, :name, 
     {include_blank: "Please select", selected: 1}, 
     {id: :user_language_id_2}) %> 
<% end %> 

生成以下的輸出:

<select id="user_language_id_1" name="user[language_ids][]"> 
    <option value="">Please select</option> 
    <option value="1" selected="selected">English</option> 
    <option value="2">Spanish</option> 
</select> 

<select id="user_language_id_2" name="user[language_ids][]"> 
    <option value="">Please select</option> 
    <option value="1" selected="selected">English</option> 
    <option value="2">Spanish</option> 
</select>