অতিরিক্ত বৈশিষ্ট্যযুক্ত হ্যাশ কেবলমাত্র রেল 3 এ সমর্থিত।
আপনি যদি রেল ২.x এ থাকেন এবং ওভাররাইড করতে চানoptions_for_select
আমি মূলত মাত্র ২ টি কোড কপি করেছি। আপনাকে এই 3 টি পদ্ধতি ওভাররাইড করতে হবে:
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
কিন্ডা অগোছালো তবে এটি একটি বিকল্প। আমি এই কোডটিকে একটি সহায়ক মডিউলে RailsOverrides
রাখি যার নাম আমি অন্তর্ভুক্ত করি ApplicationHelper
। আপনি যদি চান তবে আপনি একটি প্লাগইন / রত্নও করতে পারেন।
একটি গ্যাচা হ'ল এই পদ্ধতির সুবিধা গ্রহণ করার জন্য আপনাকে অবশ্যই সর্বদা options_for_select
সরাসরি আবেদন করতে হবে । শর্টকাট পছন্দ
select("post", "person_id", Person.all.collect {|p| [ p.name, p.id, {"data-stuff"=>"html5"} ] })
পুরানো ফলাফল উত্পন্ন করবে। পরিবর্তে এটি হওয়া উচিত:
select("post", "person_id", options_for_select(Person.all.collect {|p| [ p.name, p.id, {"data-stuff"=>"html5"} ] }))
আবার কোনও দুর্দান্ত সমাধান নয়, তবে এটি কখনও উপকারী ডেটা-অ্যাট্রিবিউটে পৌঁছানো উপযুক্ত।