Rails select_tag with html

时间:2016-04-05 09:29:46

标签: ruby-on-rails ruby-on-rails-4

我有一个select_tagoptions_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>"

我能以某种方式将两者合并在一起吗?

由于

2 个答案:

答案 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)