Ruby on rails rails选择框选项默认不在阵列中

Ruby on rails rails选择框选项默认不在阵列中,ruby-on-rails,select,options,Ruby On Rails,Select,Options,嗯 这将在rails中创建一个选择框。 <%= select("dashboard_sub_category", "id",options_for_select( @vendor_sub_categories.collect {|p| [p.category_name, p.sub_category_id] }.unshift(["All Categories", 0]))) %> 当我的页面加载时,我希望选择框中有一个元素: “所有类别” 我希望它在默认情况下被选中。 <

这将在rails中创建一个选择框。

<%= select("dashboard_sub_category", "id",options_for_select( @vendor_sub_categories.collect {|p| [p.category_name, p.sub_category_id] }.unshift(["All Categories", 0]))) %>

当我的页面加载时,我希望选择框中有一个元素:

“所有类别”

我希望它在默认情况下被选中。

<%= select("dashboard_sub_category", "id",options_for_select( @vendor_sub_categories.collect {|p| [p.category_name, p.sub_category_id] }.unshift(["All Categories", 0]))) %>
我像上面一样使用了取消移位


这是个好主意吗?还有其他方法吗?我个人喜欢将选择器选项的创建提取到before_过滤器中,这样视图就不必执行任何代码。它可以只接收一些类似于
@options
的内容,将来您可以在不更改视图的情况下更改生成方式,只更改控制器,因为这属于它的范围。视图不应该做任何真正的编码工作

然后我通常会这样生成:

@options = Model.all.inject(Array.new) do |sel, model|
  sel << [model.category_name, model.sub_category_id]
end
@options = [["All Categories", 0]] + @options
@options=Model.all.inject(Array.new)do|sel,Model|

伙计,你的意思是,把操作移到控制器上,不要在视图中进行。 我完全同意这一点,非常感谢你的回答。

<%= select("dashboard_sub_category", "id",options_for_select( @vendor_sub_categories.collect {|p| [p.category_name, p.sub_category_id] }.unshift(["All Categories", 0]))) %>
我会将其移动到控制器并创建@options,谢谢

现在,让我们谈谈我不同意的地方

你是说

这个,

我能得到一个解释吗?
ruby-1.9.2-p290:027>计时=Benchmark.measure{@options=v.sub_categories.inject(Array.new)do|sel,model|
ruby-1.9.2-p290:028>选择端
ruby-1.9.2-p290:030?>@options=[[“所有类别”,0]]+@options
ruby-1.9.2-p290:031?>}
=>   0.000000   0.000000   0.000000 (  0.000079)
ruby-1.9.2-p290:023>计时=Benchmark.measure{v.subèu categories.collect{p|p|[p.category_name,p.subèu categories_id]}.unshift([“所有类别”,0]))
=>   0.000000   0.000000   0.000000 (  0.000086)

尝试将“包含”空白添加到选择代码中,然后在数据库中将默认位置设置为0或所有类别,以便在访问“选择”菜单时,默认值为0/All Categories

{:include_blank => 'All Categories'}
请注意,如果zI将其放在正确的括号内,请尝试此操作

<%= select("dashboard_sub_category", "id",options_for_select( @vendor_sub_categories.collect {|p| [p.category_name, p.sub_category_id] }.unshift(["All Categories", 0], { :include_blank => 'All Categories' }))) %>
“所有类别”}))%>

对不起,我本应该更明确一些,我的意思是,我个人喜欢以这种方式生成它们,没有其他原因,只是我觉得它更容易阅读。请查看我的编辑。你的方法既省时又可读。哦,我没意识到它实际上更快了。好了,你来了!谢谢你的信息!没有人,包括blank,只是在其中添加了另一个“所有类别”。@beck03076是的,但您可以将其设置为默认值。另一个解决方案是使用分组集合,选择并在其他地方设置所有类别名称。
<%= select("dashboard_sub_category", "id",options_for_select( @vendor_sub_categories.collect {|p| [p.category_name, p.sub_category_id] }.unshift(["All Categories", 0], { :include_blank => 'All Categories' }))) %>