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]))) %>

当我的页面加载时,我想要在选择框中显示一个元素,

“所有类别”

我希望它默认被选中。

我已经像上面那样使用了unshift 。

这是好事吗?还有其他方法可以做到这一点吗?

4

3 回答 3

1

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

{: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' }))) %>
于 2012-05-16T15:42:43.580 回答
1

就个人而言,我喜欢将选择器选项的创建提取到可能的 before_filter 中,这样视图就不必执行任何代码。它可以只接受类似的东西@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你的选择标签。

于 2012-05-16T14:29:26.193 回答
0

伙计,您的意思是,将该操作移至控制器,不要在视图中执行。我完全同意这一点,我非常感谢你的回答。

我将把它移到控制器并创建@options,谢谢。

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

你是说?

这个,

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

比这更好,

Model.collect {|p| [p.category_name, p.sub_category_id] }.unshift(["All Categories", 0])

我可以期待一个解释吗?

ruby-1.9.2-p290 :027 >  timing = Benchmark.measure {@options = v.sub_categories.inject(Array.new) do |sel, model|
ruby-1.9.2-p290 :028 >        sel << [model.category_name, model.sub_category_id]
ruby-1.9.2-p290 :029?>     end
ruby-1.9.2-p290 :030?>   @options = [["All Categories", 0]] + @options
ruby-1.9.2-p290 :031?>   }
 =>   0.000000   0.000000   0.000000 (  0.000079)



ruby-1.9.2-p290 :023 > timing = Benchmark.measure { v.sub_categories.collect {|p| [p.category_name, p.sub_category_id] }.unshift(["All Categories", 0])}
 =>   0.000000   0.000000   0.000000 (  0.000086)
于 2012-05-16T15:10:59.747 回答