gpt4 book ai didi

ruby-on-rails - grouped_collection_select 的自定义数据属性

转载 作者:行者123 更新时间:2023-12-02 01:58:47 26 4
gpt4 key购买 nike

grouped_collection_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. 使用 grouped_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 选项。

将与 View 相关的方法放入模型中有一个缺点。它可能会在未来的 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

你的 View 会变成:

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

关于ruby-on-rails - grouped_collection_select 的自定义数据属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18364876/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com