我有一个select_tag
,options_for_select
包含一个集合,但想要添加一个由html组成的选项
所以我有
<nav role="select">
<%= select_tag "category_filter", options_for_select(@categories.collect{ |c| [c.name, c.id, data: { :filter => '.' + c.name.delete(' ') }] }), prompt: 'Select Category' %>
</nav>
但我希望我的第一个选择是
"<option value='All' data-filter='*' class='show-all'>All</option>"
我能以某种方式将两者合并在一起吗?
由于
答案 0 :(得分:1)
怎么样
<nav role="select">
<%= select_tag "category_filter", "<option value='All' data-filter='*' class='show-all'>All</option>" + options_for_select(@categories.collect{ |c| [c.name, c.id, data: { :filter => '.' + c.name.delete(' ') }] }), prompt: 'Select Category' %>
</nav>
由于options_for_select返回一串选项,你可以将这两个选项连接起来。
另外,我会将此选项生成逻辑放在视图助手中:)。
答案 1 :(得分:1)
使用['All', 'All', data: {filter: '*'}]
将数组options_for_select
添加到作为Array#unshift
的参数传递的数组的第一个位置,可以轻松解决您的问题。
(这是很多阵列)。
但是那样,你的代码会变得很混乱......而且由于这个逻辑绝对不应该在视图中,我建议你看一下演示者模式(http://eewang.github.io/blog/2013/09/26/presenting-the-rails-presenter-pattern/)。
这是一个简化的例子:
添加演示者:
class CategoriesPresenter
def initialize(categories)
@categories = categorie
end
def select_options
categories_options.unshift(all_option)
end
private
def categories_options
@categories.collect do |c|
[c.name, c.id, data: { :filter => '.' + c.name.delete(' ') }] }
end
end
def all_option
['All', 'All', data: {filter: '*'}]
end
end
然后在你的控制器中:
@categories = CategoriesPresenter.new(categories)
并在您看来:
options_for_select(@categories.select_options)