Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html 轨道';集合“选择帮助器方法和”;创建项目";最后的选择_Html_Ruby On Rails - Fatal编程技术网

Html 轨道';集合“选择帮助器方法和”;创建项目";最后的选择

Html 轨道';集合“选择帮助器方法和”;创建项目";最后的选择,html,ruby-on-rails,Html,Ruby On Rails,是否可以将添加到使用集合\u select助手方法创建的的末尾 现在我有 f.collection_select(:category_id , @categories, :id, :name, {:prompt => 'Please select a category'}) 产生 <select id="product_category_id" name="product[category_id]"> <option value="">Please selec

是否可以将
添加到使用
集合\u select
助手方法创建的
的末尾

现在我有

f.collection_select(:category_id , @categories, :id, :name, {:prompt => 'Please select a category'})
产生

<select id="product_category_id" name="product[category_id]">
  <option value="">Please select a category</option>
  <option value="7">category one</option>
  <option value="8">category 2</option>
</select>

请选择一个类别
第一类
第2类
我想要的是

<select id="product_category_id" name="product[category_id]">
  <option value="">Please select a category</option>
  <option value="7">category one</option>
  <option value="8">category 2</option>
  <option value="new">..or create a new one</option>
</select>

请选择一个类别
第一类
第2类
…或者创建一个新的
这是可能的,还是我应该在集合中循环并手动生成选项?

简短回答:否

长回答:当然,但你必须狡猾

  • 创建这样一个类:

    class New_option_placeholder
      def id 
        "new"
      end
    
      def name
        "...or create a new one"
      end
    end
    
  • 不要传递
    @categories
    ,而是传递
    @categories+New\u选项\u占位符。New


如果(如注释所示)您正在寻找更简洁的内容,您可以
要求“ostruct”
,然后传递
@categories+[OpenStruct.new(:id=>'new',:name=>'…或创建一个新的])]
来完成基本相同的任务

您可能应该使用
选择

像这样:

f.select(:category_id, @categories.collect {|p| [ p.name, p.id ] } + [ [ 'Or create a new one', 'new' ] ], {:include_blank => 'Please select a category'})

祝你好运

同意简短回答“不”和长篇回答“狡猾”,但我刚才做的是,我认为比这两种解决方案中的任何一种都简单,并且对我有效:

将下一行包装在erb标签内,即

f.collection\u选择:advision\u group\u id,advisementGroup.find(:all,:order=>“name DESC”)“New group”),:id,:name,:include\u blank=>true

只需使用
.new
创建一个新对象,并随
:include_blank=>true
一起输入您想要显示的任何文本即可。我无法评论,否则我会将其添加到上面的答案中

获取选项->值“新建”,“或创建一个新的”。。而不是

f.select(:category_id, @categories.collect {|p| [ p.name, p.id ] } + ['Or create a new one','new'], {:include_blank => 'Please select a category'})


注意选项周围的额外[]。这使得数组作为选项、值对工作。。这会创建两个额外的选项,都是name等于value,“或者创建一个新的”和“new”,我也尝试用散列代替数组,散列[“name”,“create a new one”,“id”,“new”],但是我得到了一个“无法将散列转换为数组”。。数字…所以。。这就可以了,但是,关于如何设置一个与选项中的文本不同的值,有什么想法吗?这可能是可行的,但这是一个太多的解决方法,所以我想我会选择Gdeglin的解决方案+1仍然是因为它实现了我想要的我认为当你得到Gdeglin的解决方案时,你会有比这个更多的运动部件。如果你只是在寻找一个单行版本,我会添加一个。。。
f.select(:category_id, @categories.collect {|p| [ p.name, p.id ] } + ['Or create a new one','new'], {:include_blank => 'Please select a category'})
f.select(:category_id, @categories.collect {|p| [ p.name, p.id ] } + [['Or create a new one','new']], {:include_blank => 'Please select a category'})