2013-08-21 55 views
3

grouped_collection_select接受9個參數,包括選項屬性。如何在選項中添加一個自定義屬性,一個數據標籤,在選擇選項時使用?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

似乎沒有很好的和適當的記錄方式來做到這一點。

解決方法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選項。

它有一個缺點,把視圖相關的方法,你的模型。而且它可能會與未來的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))