【问题标题】:rails select box options default not from the arrayrails 选择框选项默认不是来自数组
【发布时间】:2012-05-16 13:47:23
【问题描述】:

好的,

这会在 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

这样好吗?还有其他方法吗?

【问题讨论】:

    标签: ruby-on-rails select options


    【解决方案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作为你的选择标签。

    【讨论】:

    • 请看我的编辑。您的方式既省时又易读。
    • 哦,我没有意识到它实际上更快哈。好吧,你去吧!感谢您提供这些信息!
    【解决方案2】:

    尝试将包含空白添加到您的选择代码中,然后在您的数据库中将默认位置设置为 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' }))) %>
    

    【讨论】:

    • 没有人,包括空白,只是添加另一个“所有类别”。
    • @beck03076 是的,但您可以将其设置为默认值。另一种解决方案是使用 grouped_collection_select 并将 All Categories 名称设置在别处。
    【解决方案3】:

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

    我会将其移至控制器并创建@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)
    

    【讨论】:

    • 对不起,我应该更明确一点,我的意思是我个人喜欢以这种方式生成它们,除了我觉得它更易于阅读之外没有其他原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    • 2014-12-02
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    相关资源
    最近更新 更多