4

我有这个select_tag

select_tag :id, options_for_select(Portal.all.collect{|p| [p.name, portal_datum_path(p.id)]}, [@portal.name, portal_datum_path(@portal)]), :onChange => "window.location=($(this).val());"

它允许用户选择一个门户来查看某些元素,我想按字母顺序显示这些门户。

我尝试在控制器中订购 :name 但没有获胜。

def index
  @portals = Portal.with_name_or_subdomain(params[:keyword]).order(:name).limit(100)
end

我查看了 rails 文档 select_tag 本身没有内置选项是否有一些我应该使用的秘密选项?

4

4 回答 4

6

一个小时后,您所要做的就是.sort传递给 options_for_select 的选项数组。这是我的 hack 它是一个修复但不是很性感

select_tag :id, options_for_select(Portal.all.collect{|p| [p.name, portal_datum_path(p.id)]}.sort, [@portal.name, portal_datum_path(@portal)]), :onChange => "window.location=($(this).val());"

希望有帮助

于 2013-04-02T10:16:42.567 回答
1

将其更改为

select_tag :id, options_from_collection_for_select(portals,:name, :id, 1), :onChange => "window.location=($(this).val());"**强文本**
于 2013-04-02T09:43:56.730 回答
1

正如您所做的那样,将您的选项收集到一个数组中:

options = Portal.all.collect{|p| [p.name, portal_datum_path(p.id)]},    [@portal.name, portal_datum_path(@portal)])

然后排序:

options.sort!{ |x, y| x[0] <=> y[0] }

我在 options_for_select 的猴子补丁中执行此操作,这是我为处理各种选择内容而构建的模块的一部分,因为像这样对选择进行排序比不这样做更常见。

def options_for_select(options, selected_items:nil, alphabetize: true)
  options.sort!{ |x, y| x[0] <=> y[0] } if alphabetize 
  super(options, selected_items)
end
于 2015-10-31T02:36:24.957 回答
0

试试这个:

select_tag :id, options_for_select(Portal.all.order(name: :asc).collect{|p| [p.name, portal_datum_path(p.id)]}.sort, [@portal.name, portal_datum_path(@portal)]), :onChange => "window.location=($(this).val());"
于 2022-01-19T02:55:06.830 回答