ruby-on-rails – 带有grouped_options_for_select命令的select_tag帮助程序

我的模型中有这个:

LOCATION_IN_UK = {'England' => [['Berkshire',1],['Cambridgeshire',2],['Cheshire',3]],'Scotland' => [['Dumfries and galloway',4],['Fife',5],['Lothian',6]],'Others' => [['Outside UK',7]]}

这是在视图中:

<%= select_tag :location,grouped_options_for_select(Location::LOCATION_IN_UK),:id => 'location-dropdown' %>

代码生成以下html:

<select id="location-dropdown" name="location">
  <optgroup label="England">
    <option value="1">Berkshire</option> 
    <option value="2">Cambridgeshire</option> 
    <option value="3">Cheshire</option></optgroup>
  <optgroup label="Others">
    <option value="7">Outside UK</option></optgroup>
  <optgroup label="Scotland">
    <option value="4">Dumfries and galloway</option> 
    <option value="5">Fife</option> 
    <option value="6">Lothian</option></optgroup>
</select>

1.如何跳过按字母顺序排序的顺序.我希望元素的位置与哈希LOCATION_IN_UK完全相同.
2.如何在此插入提示? :prompt => ‘请选择’不起作用

解决方法

要回答提示问题,提示不是哈希,它是方法调用的第三个参数.所以你会这样做:

<%= select_tag :location,grouped_options_for_select(LOCATIONS_IN_UK,nil,"Please Select"),:id => 'location-dropdown' %>

看看源代码,似乎没有办法跳过排序.你可以编写自己的帮助方法.这是来源

# File actionpack/lib/action_view/helpers/form_options_helper.rb,line 449
      def grouped_options_for_select(grouped_options,selected_key = nil,prompt = nil)
        body = ''
        body << content_tag(:option,prompt,{ :value => "" },true) if prompt

        grouped_options = grouped_options.sort if grouped_options.is_a?(Hash)

        grouped_options.each do |group|
          body << content_tag(:optgroup,options_for_select(group[1],selected_key),:label => group[0])
        end

        body.html_safe
      end

您可以修改/覆盖该方法,但如果您在其他地方使用此函数,则可能会中断,这就是为什么我建议您将以下内容放在application_helper中.

def unsorted_grouped_options_for_select(grouped_options,prompt = nil)
  body = ''
  body << content_tag(:option,true) if prompt

  ##Remove sort
  #grouped_options = grouped_options.sort if grouped_options.is_a?(Hash)

  grouped_options.each do |group|
    body << content_tag(:optgroup,:label => group[0])
  end

  body.html_safe
end

然后,您可以调用unsorted_grouped_options_for_select,它应该可以工作.

<%= select_tag :location,unsorted_grouped_options_for_select(LOCATION::LOCATION_IN_UK,:id => 'location-dropdown' %>

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...