রুবি রেল এফ কাস্টম বৈশিষ্ট্য সহ অপশন নির্বাচন করুন


115

আমার এই মত একটি ফর্ম নির্বাচন বিবৃতি আছে:

= f.select :country_id, @countries.map{ |c| [c.name, c.id] }

যা এই কোডে ফলাফল:

...
<option value="1">Andorra</option>
<option value="2">Argentina</option>
...

তবে আমি আমার বিকল্পগুলিতে একটি কাস্টম এইচটিএমএল বৈশিষ্ট্য যুক্ত করতে চাই:

...
<option value="1" currency_code="XXX">Andorra</option>
<option value="2" currency_code="YYY">Argentina</option>
...

2
রেলগুলি সেই কার্যকারিতা সরবরাহ করে না, আপনাকে সেই মার্কআপটি তৈরি করতে কোনও সহায়ক তৈরি করতে হবে। এছাড়াও, মনে রাখবেন যে আপনি যে উদাহরণটি উল্লেখ করেছেন তা বৈধ এইচটিএমএল নয়।
আগস্টো

আমি জানি, আমার উদাহরণ বৈধ এইচটিএমএল নয় ... আমি অনুমান করি যে ফলাফলগুলি আমি চাই সেগুলি পেতে আমার উপায় পরিবর্তন করতে হবে, ধন্যবাদ!
el_quick

উত্তর:


356

রেলগুলি বিদ্যমান অপশন_সফেস_স্লেভার সহায়ক ব্যবহার করে বিকল্পগুলি নির্বাচন করতে কাস্টম বৈশিষ্ট্য যুক্ত করতে পারে। আপনার প্রশ্নের কোডটিতে আপনার এটি প্রায় ছিল। এইচটিএমএল 5 ডেটা-অ্যাট্রিবিউট ব্যবহার করে:

<%= f.select :country_id, options_for_select(
    @countries.map{ |c| [c.name, c.id, {'data-currency_code'=>c.currency_code}] }) %>

প্রাথমিক নির্বাচন যুক্ত করা হচ্ছে:

<%= f.select :country_id, options_for_select(
    @countries.map{ |c| [c.name, c.id, {'data-currency_code'=>c.currency_code}] }, 
    selected_key = f.object.country_id) %>

আপনার যদি গোষ্ঠীভুক্ত বিকল্পের প্রয়োজন হয় তবে আপনি এই জাতীয় গোষ্ঠীযুক্ত_অভিজ্ঞ_সামগ্রী_নির্বাচিত সাহায্যকারী ব্যবহার করতে পারেন, (যদি @ কন্টিনেন্টগুলি মহাদেশীয় অবজেক্টগুলির একটি অ্যারে হয়, প্রত্যেকের একটি দেশ পদ্ধতি রয়েছে):

<%= f.select :country_id, grouped_options_for_select(
    @continents.map{ |group| [group.name, group.countries.
    map{ |c| [c.name, c.id, {'data-currency_code'=>c.currency_code}] } ] }, 
    selected_key = f.object.country_id) %>

ক্রেডিটটি পল @ পোগোডেনে যেতে হবে যারা ডকসগুলিতে এটি খুঁজে পাওয়ার বিষয়ে পোস্ট করেননি, তবে রেলের উত্স পড়ে। https://web.archive.org/web/20130128223827/http://www.pogodan.com/blog/2011/02/24/custom-html-attributes-in-options-for-select


6

আপনি নিম্নলিখিত হিসাবে এটি করতে পারে:

= f.select :country_id, @countries.map{ |c| [c.name, c.id, { 'data-currency-code' => c.currency_code} ] }

সঠিক, তবে ইতিমধ্যে অ্যানোটোর্টাইজ হাউজের উত্তরে উল্লেখ করা হয়েছে।
কেলভিন

গৃহীত উত্তর রুবি ব্যবহার করে কাস্টম বৈশিষ্ট্যগুলি চিত্রিত করে না। এটি প্রথমটি উত্তর হিসাবে এটি রুবীর মাধ্যমে কীভাবে করা যায় তা দেখায় বলে আমি এটি আরও ভাল অনুভব করি।
নিখিল গুপ্তে

5

এটি সরাসরি কারাগারের সাথে সম্ভব নয় এবং কাস্টম বৈশিষ্ট্যগুলি তৈরি করতে আপনাকে নিজের সহায়ক তৈরি করতে হবে। এটি বলেছিল, আপনি যা চান তা সম্পাদন করার জন্য সম্ভবত দুটি ভিন্ন উপায় রয়েছে:

(1) এইচটিএমএল 5 এ একটি কাস্টম বৈশিষ্ট্যের নাম ব্যবহার করা। এইচটিএমএল 5 এ আপনাকে কাস্টম বৈশিষ্ট্যযুক্ত নাম দেওয়ার অনুমতি দেওয়া হয়েছে তবে সেগুলি 'ডেটা-' দিয়ে প্রি-পেনডে থাকতে হবে। এই কাস্টম বৈশিষ্ট্যগুলি আপনার ফর্মের সাথে জমা দেওয়া হবে না তবে সেগুলি জাভাস্ক্রিপ্টে আপনার উপাদানগুলিতে অ্যাক্সেস করতে ব্যবহার করা যেতে পারে। আপনি যদি এটি সম্পাদন করতে চান তবে আমি এমন একটি সহায়ক তৈরি করার পরামর্শ দেব যা এই জাতীয় বিকল্পগুলি তৈরি করে:

<option value="1" data-currecy-code="XXX">Andorra</option>

(২) অতিরিক্ত ডেটা জমা দেওয়ার জন্য কাস্টম বিভাজন সহ মানগুলি ব্যবহার করা। আপনি যদি আসলে মুদ্রা-কোড জমা দিতে চান তবে আমি আপনার নির্বাচিত বাক্সটি এই জাতীয়ভাবে তৈরি করার পরামর্শ দেব:

= f.select :country_id, @countries.map{ |c| [c.name, "#{c.id}:#{c.currency_code}"] }

এটি দেখতে এইচটিএমএল তৈরি করা উচিত:

<option value="1:XXX">Andorra</option>
<option value="2:YYY">Argentina</option>

যা আপনি নিজের নিয়ামকটিতে পার্স করতে পারেন:

@id, @currency_code = params[:country_id].split(':')

3
দুর্দান্ত উত্তর। আমি 1 নম্বর পদ্ধতির বিকল্প বেছে নিয়েছি এবং এটি অন্য কাউকে সহায়তা করার ক্ষেত্রে আমি কীভাবে সহায়ককে তৈরি করেছি তা ব্লগ করেছি। redguava.com.au/2011/03/…
জোয়েল

অন্যান্য মন্তব্যকারীদের সাথে সম্মত হন - নীচে অ্যানাটার্টোরাইজের উত্তর দেখুন!
জ্যাকব 6

23
>>>>>>>>>>>>> উত্তর উত্তর দিন ... স্ক্রোলিং রাখুন <<<<<<<<<<<<<
স্টিভেনস্পিল

1
এটি রিলে সরাসরি সম্ভব possible দেখুন: স্ট্যাকওভারফ্লো.com
ম্যাগনে

প্যান, দয়া করে এই বিভ্রান্তিমূলক উত্তর মুছুন।
vemv

4

অতিরিক্ত বৈশিষ্ট্যযুক্ত হ্যাশ কেবলমাত্র রেল 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"} ] }))

আবার কোনও দুর্দান্ত সমাধান নয়, তবে এটি কখনও উপকারী ডেটা-অ্যাট্রিবিউটে পৌঁছানো উপযুক্ত।


0

আমিও এই ইস্যুটিতে দৌড়েছি এবং এই সমস্যাটি সমাধান করার জন্য "বর্ধিত_পরিষ্কার" রুবি রত্ন তৈরি করেছি। আপনি এখানে পেতে পারেন:

https://github.com/bkuhlmann/enhanced_select


2
Github.com- এ একটি 404 পৃষ্ঠায় এই লিঙ্কগুলি রয়েছে
cevaris
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.