2012-12-31 99 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>