首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有select_tag命令的grouped_options_for_select助手

具有select_tag命令的grouped_options_for_select助手
EN

Stack Overflow用户
提问于 2011-04-10 14:05:41
回答 2查看 4.4K关注 0票数 3

我的模特儿里有这个:

代码语言:javascript
复制
LOCATION_IN_UK = {'England' => [['Berkshire', 1],['Cambridgeshire',2],['Cheshire',3]], 'Scotland' => [['Dumfries and Galloway',4],['Fife',5],['Lothian',6]], 'Others' => [['Outside UK',7]]}

这就是我们的观点:

代码语言:javascript
复制
<%= select_tag :location, grouped_options_for_select(Location::LOCATION_IN_UK), :id => 'location-dropdown' %>

此代码生成以下html:

代码语言:javascript
复制
<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 => 'Please select'不工作

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-10 14:21:15

要回答提示问题,提示不是散列,它是方法调用的第三个参数。所以你会做:

代码语言:javascript
复制
 <%= select_tag :location, grouped_options_for_select(LOCATIONS_IN_UK, nil, "Please Select"), :id => 'location-dropdown' %>

看一下源代码,似乎没有办法跳过排序。不过,您可以编写自己的助手方法。这是来源

代码语言:javascript
复制
# 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中。

代码语言:javascript
复制
def unsorted_grouped_options_for_select(grouped_options, selected_key = nil, prompt = nil)
  body = ''
  body << content_tag(:option, prompt, { :value => "" }, 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, options_for_select(group[1], selected_key), :label => group[0])
  end

  body.html_safe
end

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

代码语言:javascript
复制
 <%= select_tag :location, unsorted_grouped_options_for_select(LOCATION::LOCATION_IN_UK, nil, "Please Select"), :id => 'location-dropdown' %>
票数 11
EN

Stack Overflow用户

发布于 2014-09-17 19:53:44

我也有同样的问题。您可以通过使用数组版本而不是散列来解决这个问题,因为它只在is_a?(散列)的情况下才对其进行排序。有关格式,请参阅文档:http://apidock.com/rails/ActionView/Helpers/FormOptionsHelper/grouped_options_for_select

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5612274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档