1

我有狀態的列表,從一個國家,我想顯示他們在<select>。由於我試圖展示代表每個州的標誌的圖標,因此我正在使用this JQuery插件。無論如何,在這一點上,這是一個純粹的Rails問題。軌,collection_select和PROC

要使用該插件,我需要在此select中包含的每個option標記上設置「數據圖像」屬性。

我至今是:

<%= collection_select(:state, :code, @states, :code, 
:name, {"data-image" => lambda {|state| image_path("/flags/#{state.code}.png") }}) %> 

我試過在很多方面給屬性設置「數據圖像」的每一個option但到目前爲止,其結果是:

<select id="state_code" name="state[code]"> 
    <option value="foo">State Foo</option> 
    <option value="bar" selected="selected">State Bar</option> 
</select> 

因此,我不是成功的注入我的「數據圖像」屬性。我一直在尋找一些光,我看到this [api.rubyonrails]和下面的例子中,

collection_select(:post, :category_id, Category.all, :id, :name, {:disabled => lambda{|category| category.archived? }}) 

,基本上是我所期待的和我的是幾乎同樣的事情,但它不工作。我正在使用Rails 2.3.11。我會感激你的建議。

回答

0

所以,我最終解決這個問題,以下是完整的解決方案。據我瞭解,因爲我使用Rails 2.3,所以沒有助手支持data前綴屬性。原來,我需要使用Rails 3 options_for_select助手,正如this所指出的答案。作爲一個方面說明,而不是使用msDropDown插件,並且我最終使用了ddSlick。另外,我沒有使用collection_select,而是使用了select_tag。那麼基本上你所擁有的是:

rails_overrides.rb

# https://stackoverflow.com/a/13962481/914874 
module RailsOverrides 
    def options_for_select(container, selected = nil) 
     return container if String === container 
     container = container.to_a if Hash === container 
     selected, disabled = extract_selected_and_disabled(selected) 

     options_for_select = container.inject([]) do |options, element| 
     html_attributes = option_html_attributes(element) 
     text, value = option_text_and_value(element) 
     selected_attribute = ' selected="selected"' if option_value_selected?(value, selected) 
     disabled_attribute = ' disabled="disabled"' if disabled && option_value_selected?(value, disabled) 
     options << %(<option value="#{html_escape(value.to_s)}"#{selected_attribute}#{disabled_attribute}#{html_attributes}>#{html_escape(text.to_s)}</option>) 
     end 

     options_for_select.join("\n").html_safe 
    end 

    def option_text_and_value(option) 
    # Options are [text, value] pairs or strings used for both. 
    case 
    when Array === option 
     option = option.reject { |e| Hash === e } 
     [option.first, option.last] 
    when !option.is_a?(String) && option.respond_to?(:first) && option.respond_to?(:last) 
     [option.first, option.last] 
    else 
     [option, option] 
    end 
    end 

    def option_html_attributes(element) 
    return "" unless Array === element 
    html_attributes = [] 
    element.select { |e| Hash === e }.reduce({}, :merge).each do |k, v| 
     html_attributes << " #{k}=\"#{ERB::Util.html_escape(v.to_s)}\"" 
    end 
    html_attributes.join 
    end 
end 

application_helper.rb

module ApplicationHelper 
    include RailsOverrides 
end 

index.html.erb

<%= select_tag(:state, options_for_select (states.map { |state| [state.name, state.code, {"data-imagesrc" => image_path("flags/#{state.code}.png"), "data-description" => "Data from #{state.name}"}]}, current_state.code)) %> 

這裏,current_state被選擇作爲默認選項的狀態。例如,我將它存儲在一個session變量中,但爲了簡單起見,它可能是@current_state

解決該問題的另一種方法是使用options_from_collection_for_select_with_data的修改版本,因此無需公開map

1

退房第二個答案this Stackoverflow question

基本上,它涉及到使用options_for_select助手來創建自定義data前綴屬性。

+0

感謝,我已經upvoted你的答案,並張貼完成的答案。在我看到你的答案的時候,我已經理解了Rails 2上的options_for_select和data屬性問題。 – Eduardo

+0

我完全錯過了你使用Rails 2的事實,我的不好!我必須更仔細地開始閱讀。很高興你弄清楚了事情! – Zajn

+0

沒有問題,如果我以前沒有看到過這個問題,那麼你的鏈接就是北方的解決方案。萬分感謝!乾杯! – Eduardo