grouped_collection_select的自定义数据属性

时间:2013-08-21 18:18:42

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

grouped_collection_select接受九个参数,包括options属性。如何在选项中添加自定义属性(数据标记),以便在选择选项时使用?

现在将select编码为:

= f.grouped_collection_select :course_id, Discipline.order(:name), :courses, :name, :id, :display

我想添加自定义数据属性,以便输出如下:

<select id="enrollment_course_id" name="enrollment[course_id]">
    <option selected="selected" value="7" data-duration=8>Introduction to Guitar (8 weeks)</option>
    <option value="8" data-duration=8>Strings 1-3 (8 weeks)</option>
    <option value="9" data-duration=10>Strings 4-6 (10 weeks)</option>
    <option value="10" data-duration=12>Basic Chords (12 weeks)</option>
</select>

我们如何以编程方式生成自定义属性?

1 个答案:

答案 0 :(得分:1)

似乎没有一个好的和正确记录的方法来做到这一点。

解决方案1。使用groups_collection_select的未完全记录的功能:

f.grouped_collection_select :course_id, Discipline.order(:name), :courses_with_duration_data, :name, ->(el){el.first.id}, ->(el){el.first.display}

您需要像这样实施courses_with_duration_data

class Discipline
  has_many :courses
  def courses_with_duration_data
    courses.map {|course| [course,{data: {duration: course.duration}}]}
  end
end

它依赖于如果将数组数组传递给options_for_select,则数组中的散列将被视为html选项。

它的缺点是将与视图相关的方法放到模型中。并且它可能会破坏未来的rails版本,因为这种用法没有记录在grouped_collection_select上,所以你最好自己生成这些选项。

解决方案2. :您自己重新实施选项:

在帮助程序中重新实现自定义option_groups_from_collection_for_select。这看起来像这样:

def options_for_disciple_with_courses(disciplines)
  disciplines.map do |discipline|
    option_tags = options_for_select(
      discipline.courses.map {|course| [course.display, course.id, {data: {duration: course.duration}}]}
    )
    content_tag(:optgroup, option_tags, label: discipline.name)
  end.join.html_safe
end

你的观点将成为:

f.select :course_id, options_for_disciple_with_courses(Discipline.order(:name))