Ruby on Rails 5.2 - ActionView::Helpers::FormBuilder

क्लास एक्शन व्यू :: हेल्पर्स :: फॉर्मब्यूलर




ruby

क्लास एक्शन व्यू :: हेल्पर्स :: फॉर्मब्यूलर

जनक:
Object

FormBuilder ऑब्जेक्ट किसी विशेष मॉडल ऑब्जेक्ट से संबद्ध होता है और आपको मॉडल ऑब्जेक्ट से संबंधित फ़ील्ड जेनरेट करने की अनुमति देता है। form_for या fields_for form_for का उपयोग करते समय FormBuilder ऑब्जेक्ट का form_for fields_for । उदाहरण के लिए:

<%= form_for @person do |person_form| %>
  Name: <%= person_form.text_field :name %>
  Admin: <%= person_form.check_box :admin %>
<% end %>

उपरोक्त ब्लॉक में, एक FormBuilder वस्तु को person_form चर के रूप में प्राप्त किया जाता है। यह आपको उनके नाम विधियों को निर्दिष्ट करके text_field और check_box फ़ील्ड उत्पन्न करने की अनुमति देता है, जो अंतर्निहित टेम्पलेट को संशोधित करता है और फॉर्म के साथ @person मॉडल ऑब्जेक्ट को @person

FormBuilder ऑब्जेक्ट को FormHelper मॉड्यूल में विधियों के लिए एक प्रॉक्सी के रूप में सेवारत माना जा सकता है। हालाँकि, यह वर्ग आपको उस मॉडल ऑब्जेक्ट के साथ तरीकों को कॉल करने की अनुमति देता है, जिसके लिए आप फॉर्म का निर्माण कर रहे हैं।

आप इस वर्ग को उप-वर्ग FormBuilder अपने स्वयं के कस्टम FormBuilder टेम्पलेट बना सकते हैं। उदाहरण के लिए:

class MyFormBuilder < ActionView::Helpers::FormBuilder
  def div_radio_button(method, tag_value, options = {})
    @template.content_tag(:div,
      @template.radio_button(
        @object_name, method, tag_value, objectify_options(options)
      )
    )
  end
end

उपरोक्त कोड एक नई विधि div_radio_button बनाता है जो नए रेडियो बटन के चारों ओर एक div लपेटता है। ध्यान दें कि जब विकल्प पास हो जाते हैं, तो आपको ऑब्जेक्ट को सही तरीके से पास करने के लिए ऑब्जेक्ट को मॉडल ऑब्जेक्ट के लिए कॉल करना होगा। यदि objectify_options को नहीं बुलाया जाता है, तो नव निर्मित सहायक को वापस मॉडल से जोड़ा नहीं जाएगा।

ऊपर से div_radio_button कोड अब निम्नानुसार उपयोग किया जा सकता है:

<%= form_for @person, :builder => MyFormBuilder do |f| %>
  I am a child: <%= f.div_radio_button(:admin, "child") %>
  I am an adult: <%= f.div_radio_button(:admin, "adult") %>
<% end -%>

प्रपत्र निर्माण के लिए सहायक विधियों का मानक सेट field_helpers वर्ग विशेषता में स्थित है।

गुण

सूचकांक [R]
मल्टीपार्ट [R]
मल्टीपार्ट? [आर]
वस्तु [आरडब्ल्यू]
object_name [RW]
विकल्प [आरडब्ल्यू]

पब्लिक क्लास के तरीके

# File actionview/lib/action_view/helpers/form_helper.rb, line 1645
def self._to_partial_path
  @_to_partial_path ||= name.demodulize.underscore.sub!(/_builder$/, "")
end
नया (object_name, ऑब्जेक्ट, टेम्पलेट, विकल्प) स्रोत दिखाएँ
# File actionview/lib/action_view/helpers/form_helper.rb, line 1657
def initialize(object_name, object, template, options)
  @nested_child_index = {}
  @object_name, @object, @template, @options = object_name, object, template, options
  @default_options = @options ? @options.slice(:index, :namespace, :skip_default_ids, :allow_method_names_outside_object) : {}
  @default_html_options = @default_options.except(:skip_default_ids, :allow_method_names_outside_object)

  convert_to_legacy_options(@options)

  if @object_name.to_s.match(/\[\]$/)
    if (object ||= @template.instance_variable_get("@#{Regexp.last_match.pre_match}")) && object.respond_to?(:to_param)
      @auto_index = object.to_param
    else
      raise ArgumentError, "object[] naming but object param and @object var don't exist or don't respond to to_param: #{object.inspect}"
    end
  end

  @multipart = nil
  @index = options[:index] || options[:child_index]
end

सार्वजनिक प्रवृत्ति के तरीके

बटन (मान = शून्य, विकल्प = {}, और ब्लॉक) स्रोत दिखाएं
# File actionview/lib/action_view/helpers/form_helper.rb, line 2244
def button(value = nil, options = {}, &block)
  value, options = nil, value if value.is_a?(Hash)
  value ||= submit_default_value
  @template.button_tag(value, options, &block)
end

दिए गए फॉर्म के लिए सबमिट बटन जोड़ें। जब कोई मूल्य नहीं दिया जाता है, तो यह जांचता है कि क्या वस्तु एक नया संसाधन है या नहीं उचित लेबल बनाने के लिए:

<%= form_for @post do |f| %>
  <%= f.button %>
<% end %>

उपरोक्त उदाहरण में, अगर @post एक नया रिकॉर्ड है, तो यह बटन लेबल के रूप में "पोस्ट बनाएँ" का उपयोग करेगा; अन्यथा, यह "अपडेट पोस्ट" का उपयोग करता है।

उन लेबल को I18n का उपयोग helpers.submit कुंजी (सबमिट हेल्पर के समान) के तहत और अनुवाद प्रक्षेप के लिए %{model} का उपयोग करके अनुकूलित किया जा सकता है:

en:
  helpers:
    submit:
      create: "Create a %{model}"
      update: "Confirm changes to %{model}"

यह दिए गए ऑब्जेक्ट के लिए एक विशेष कुंजी की खोज करता है:

en:
  helpers:
    submit:
      post:
        create: "Add %{model}"

उदाहरण

button("Create post")
# => <button name='button' type='submit'>Create post</button>

button do
  content_tag(:strong, 'Ask me!')
end
# => <button name='button' type='submit'>
#      <strong>Ask me!</strong>
#    </button>
check_box (विधि, विकल्प = {}, check_value = "1", अनियंत्रित_वायु = "0") स्रोत
# File actionview/lib/action_view/helpers/form_helper.rb, line 2086
def check_box(method, options = {}, checked_value = "1", unchecked_value = "0")
  @template.check_box(@object_name, method, objectify_options(options), checked_value, unchecked_value)
end

एक निर्दिष्ट विशेषता ( method द्वारा पहचानी गई) तक पहुँच के लिए एक चेकबॉक्स टैग लौटाता है जो टेम्पलेट को सौंपी गई object ( object द्वारा पहचाना गया) पर होता है। यह ऑब्जेक्ट एक इंस्टेंस ऑब्जेक्ट (@object) होना चाहिए न कि स्थानीय ऑब्जेक्ट। यह इरादा है कि method एक पूर्णांक लौटाती है और यदि वह पूर्णांक शून्य से ऊपर है, तो चेकबॉक्स की जाँच की जाती है। इनपुट टैग पर अतिरिक्त विकल्पों को options साथ हैश के रूप में पारित किया जा सकता है। checked_value 1 से जबकि डिफ़ॉल्ट unchecked_value 0 पर सेट है जो बूलियन मान के लिए सुविधाजनक है।

पकड़ लिया

HTML विनिर्देशन का कहना है कि अनियंत्रित चेक बॉक्स सफल नहीं हैं, और इस तरह वेब ब्राउज़र उन्हें नहीं भेजते हैं। दुर्भाग्य से यह एक गोचर का परिचय देता है: यदि किसी Invoice मॉडल में एक paid झंडा होता है, और भुगतान किए गए चालान को संपादित करने वाले रूप में उपयोगकर्ता अपने चेक बॉक्स को अनचेक करता है, तो कोई paid पैरामीटर नहीं भेजा जाता है। तो, किसी भी मास-असाइनमेंट मुहावरे की तरह

@invoice.update(params[:invoice])

ध्वज को अपडेट नहीं किया जाएगा।

इसे रोकने के लिए सहायक बहुत ही चेक बॉक्स से पहले एक सहायक छिपा क्षेत्र उत्पन्न करता है। छिपे हुए फ़ील्ड का नाम समान है और इसकी विशेषताएँ एक अनियंत्रित चेक बॉक्स की नकल करती हैं।

इस तरह, क्लाइंट या तो केवल छिपे हुए फ़ील्ड को भेजता है (चेक बॉक्स का प्रतिनिधित्व अनियंत्रित है), या दोनों फ़ील्ड। चूंकि HTML विनिर्देश कहता है कि कुंजी / मान जोड़े को उसी क्रम में भेजा जाना है जो वे फॉर्म में दिखाई देते हैं, और पैरामीटर निष्कर्षण को क्वेरी स्ट्रिंग में किसी भी दोहराया कुंजी की अंतिम घटना मिलती है, जो सामान्य रूपों के लिए काम करती है।

दुर्भाग्यवश, जब चेक बॉक्स किसी सरणी-जैसा पैरामीटर के भीतर जाता है, तब काम नहीं करता

<%= fields_for "project[invoice_attributes][]", invoice, index: nil do |form| %>
  <%= form.check_box :paid %>
  ...
<% end %>

क्योंकि पैरामीटर नाम पुनरावृत्ति ठीक वही है जो रेल सरणी के तत्वों को अलग करना चाहता है। एक चेक किए गए चेक बॉक्स के साथ प्रत्येक आइटम के लिए आपको केवल "विशेषता" के लिए असाइन किया गया एक अतिरिक्त भूत आइटम मिलता है।

उस स्थिति में या तो check_box_tag उपयोग check_box_tag या सरणियों के बजाय हैश का उपयोग करना बेहतर होता है।

# Let's say that @post.validated? is 1:
check_box("validated")
# => <input name="post[validated]" type="hidden" value="0" />
#    <input checked="checked" type="checkbox" id="post_validated" name="post[validated]" value="1" />

# Let's say that @puppy.gooddog is "no":
check_box("gooddog", {}, "yes", "no")
# => <input name="puppy[gooddog]" type="hidden" value="no" />
#    <input type="checkbox" id="puppy_gooddog" name="puppy[gooddog]" value="yes" />

# Let's say that @eula.accepted is "no":
check_box("accepted", { class: 'eula_check' }, "yes", "no")
# => <input name="eula[accepted]" type="hidden" value="no" />
#    <input type="checkbox" class="eula_check" id="eula_accepted" name="eula[accepted]" value="yes" />
collection_check_boxes (विधि, संग्रह, मान_method, text_method, विकल्प = {}, html_options = {}, और ब्लॉक) दिखाएँ स्रोत
# File actionview/lib/action_view/helpers/form_options_helper.rb, line 870
def collection_check_boxes(method, collection, value_method, text_method, options = {}, html_options = {}, &block)
  @template.collection_check_boxes(@object_name, method, collection, value_method, text_method, objectify_options(options), @default_html_options.merge(html_options), &block)
end

Wraps ActionView::Helpers::FormOptionsHelper#collection_check_boxes बिल्डरों के लिए ActionView::Helpers::FormOptionsHelper#collection_check_boxes :

<%= form_for @post do |f| %>
  <%= f.collection_check_boxes :author_ids, Author.all, :id, :name_with_initial %>
  <%= f.submit %>
<% end %>

कृपया विवरण के लिए आधार हेल्पर के दस्तावेज देखें।

collection_radio_buttons (विधि, संग्रह, मान_method, text_method, विकल्प = {}, html_options = {}, और ब्लॉक) दिखाएँ स्रोत
# File actionview/lib/action_view/helpers/form_options_helper.rb, line 882
def collection_radio_buttons(method, collection, value_method, text_method, options = {}, html_options = {}, &block)
  @template.collection_radio_buttons(@object_name, method, collection, value_method, text_method, objectify_options(options), @default_html_options.merge(html_options), &block)
end

रैप्स ActionView::Helpers::FormOptionsHelper#collection_radio_buttons बिल्डरों के लिए ActionView::Helpers::FormOptionsHelper#collection_radio_buttons :

<%= form_for @post do |f| %>
  <%= f.collection_radio_buttons :author_id, Author.all, :id, :name_with_initial %>
  <%= f.submit %>
<% end %>

कृपया विवरण के लिए आधार हेल्पर के दस्तावेज देखें।

collection_select (विधि, संग्रह, value_method, text_method, विकल्प = {}, html_options = {}) दिखाएँ स्रोत
# File actionview/lib/action_view/helpers/form_options_helper.rb, line 834
def collection_select(method, collection, value_method, text_method, options = {}, html_options = {})
  @template.collection_select(@object_name, method, collection, value_method, text_method, objectify_options(options), @default_html_options.merge(html_options))
end

ActionView::Helpers::FormOptionsHelper#collection_select बिल्डरों के लिए ActionView::Helpers::FormOptionsHelper#collection_select :

<%= form_for @post do |f| %>
  <%= f.collection_select :person_id, Author.all, :id, :name_with_initial, prompt: true %>
  <%= f.submit %>
<% end %>

कृपया विवरण के लिए आधार हेल्पर के दस्तावेज देखें।

date_select (विधि, विकल्प = {}, html_options = {}) स्रोत दिखाएं
# File actionview/lib/action_view/helpers/date_helper.rb, line 1127
def date_select(method, options = {}, html_options = {})
  @template.date_select(@object_name, method, objectify_options(options), html_options)
end

ActionView::Helpers::DateHelper#date_select बिल्डरों के लिए:

<%= form_for @person do |f| %>
  <%= f.date_select :birth_date %>
  <%= f.submit %>
<% end %>

कृपया विवरण के लिए आधार हेल्पर के दस्तावेज देखें।

datetime_select (विधि, विकल्प = {}, html_options = {}) स्रोत दिखाएं
# File actionview/lib/action_view/helpers/date_helper.rb, line 1151
def datetime_select(method, options = {}, html_options = {})
  @template.datetime_select(@object_name, method, objectify_options(options), html_options)
end

Wraps ActionView::Helpers::DateHelper#datetime_select फॉर्म बिल्डरों के लिए ActionView::Helpers::DateHelper#datetime_select :

<%= form_for @person do |f| %>
  <%= f.datetime_select :last_request_at %>
  <%= f.submit %>
<% end %>

कृपया विवरण के लिए आधार हेल्पर के दस्तावेज देखें।

# File actionview/lib/action_view/helpers/form_helper.rb, line 2250
def emitted_hidden_id?
  @emitted_hidden_id ||= nil
end
फ़ील्ड्स (स्कोप = nil, मॉडल: nil, ** ऑप्शंस, और ब्लॉक) शो सोर्स
# File actionview/lib/action_view/helpers/form_helper.rb, line 1968
def fields(scope = nil, model: nil, **options, &block)
  options[:allow_method_names_outside_object] = true
  options[:skip_default_ids] = !FormHelper.form_with_generates_ids

  convert_to_legacy_options(options)

  fields_for(scope || model, model, **options, &block)
end

ActionView::FormHelper.fields सहायक विधि के लिए डॉक्स देखें।

field_for (record_name, record_object = nil, field_options = {}, और ब्लॉक) स्रोत दिखाएं
# File actionview/lib/action_view/helpers/form_helper.rb, line 1930
def fields_for(record_name, record_object = nil, fields_options = {}, &block)
  fields_options, record_object = record_object, nil if record_object.is_a?(Hash) && record_object.extractable_options?
  fields_options[:builder] ||= options[:builder]
  fields_options[:namespace] = options[:namespace]
  fields_options[:parent_builder] = self

  case record_name
  when String, Symbol
    if nested_attributes_association?(record_name)
      return fields_for_with_nested_attributes(record_name, record_object, fields_options, block)
    end
  else
    record_object = record_name.is_a?(Array) ? record_name.last : record_name
    record_name   = model_name_from_record_or_class(record_object).param_key
  end

  object_name = @object_name
  index = if options.has_key?(:index)
    options[:index]
  elsif defined?(@auto_index)
    object_name = object_name.to_s.sub(/\[\]$/, "")
    @auto_index
  end

  record_name = if index
    "#{object_name}[#{index}][#{record_name}]"
  elsif record_name.to_s.end_with?("[]")
    record_name = record_name.to_s.sub(/(.*)\[\]$/, "[\\1][#{record_object.id}]")
    "#{object_name}#{record_name}"
  else
    "#{object_name}[#{record_name}]"
  end
  fields_options[:child_index] = index

  @template.fields_for(record_name, record_object, fields_options, &block)
end

एक विशिष्ट मॉडल ऑब्जेक्ट जैसे form_for के आसपास एक स्कोप बनाता है, लेकिन स्वयं फॉर्म टैग नहीं बनाता है। यह अतिरिक्त मॉडल ऑब्जेक्ट्स को उसी रूप में निर्दिष्ट करने के लिए #fields_for उपयुक्त बनाता है।

यद्यपि fields_for का उपयोग और उद्देश्य fields_for के समान है, लेकिन इसका विधि हस्ताक्षर थोड़ा अलग है। form_for तरह, यह एक ब्लॉक मॉडल को एक विशेष मॉडल ऑब्जेक्ट से संबंधित एक ब्लॉक तक FormBuilder , और ब्लॉक के भीतर मॉडल ऑब्जेक्ट से जुड़े क्षेत्रों को उत्पन्न करने के लिए बिल्डर को तरीकों को कॉल करने की अनुमति देता है। फ़ील्ड एक मॉडल ऑब्जेक्ट को दो तरीकों से दर्शा सकते हैं - उनका नाम कैसे रखा जाता है (इसलिए नियंत्रक में params हैश के भीतर प्रस्तुत किए गए मान कैसे दिखाई देते हैं) और फ़ील्ड्स के रूप में पहली बार प्रदर्शित होने पर क्या डिफ़ॉल्ट मान दिखाए जाते हैं। इन दोनों विशेषताओं को स्वतंत्र रूप से निर्दिष्ट करने के लिए, एक वस्तु का नाम (दोनों एक प्रतीक या स्ट्रिंग द्वारा दर्शाया गया है) और ऑब्जेक्ट स्वयं अलग से विधि में पारित किया जा सकता है -

<%= form_for @person do |person_form| %>
  First name: <%= person_form.text_field :first_name %>
  Last name : <%= person_form.text_field :last_name %>

  <%= fields_for :permission, @person.permission do |permission_fields| %>
    Admin?  : <%= permission_fields.check_box :admin %>
  <% end %>

  <%= person_form.submit %>
<% end %>

इस स्थिति में, चेकबॉक्स फ़ील्ड को एचटीएमएल input टैग द्वारा प्रतिनिधित्व किया जाएगा जिसका name विशेषता permission[admin] , और जमा किया गया मान नियंत्रक params[:permission][:admin] रूप में दिखाई देगा। यदि @person.permission एक मौजूदा रिकॉर्ड है जो एक विशेषता admin , तो चेकबॉक्स की प्रारंभिक स्थिति जब पहली बार प्रदर्शित होती है, तो वह @person.permission.admin के मूल्य को दर्शाएगा।

अक्सर यह केवल fields_for ऑब्जेक्ट के लिए मॉडल ऑब्जेक्ट का नाम पास करके सरल किया जा सकता है -

<%= fields_for :permission do |permission_fields| %>
  Admin?: <%= permission_fields.check_box :admin %>
<% end %>

... जिस स्थिति में, यदि :permission भी एक उदाहरण चर @permission के नाम पर @permission , तो इनपुट फ़ील्ड की प्रारंभिक स्थिति उस चर के गुण @permission.admin के मान को दर्शाती है।

वैकल्पिक रूप से, आप केवल मॉडल ऑब्जेक्ट को ही पास कर सकते हैं (यदि पहला तर्क एक स्ट्रिंग या प्रतीक नहीं है तो fields_for को पता चलेगा कि नाम छोड़ दिया गया है) -

<%= fields_for @person.permission do |permission_fields| %>
  Admin?: <%= permission_fields.check_box :admin %>
<% end %>

और fields_for मॉडल ऑब्जेक्ट के वर्ग से फ़ील्ड का आवश्यक नाम प्राप्त करेगा, जैसे कि @person.permission , वर्ग Permission , फिर भी फ़ील्ड को permission[admin]

नोट: यह FormOptionsHelper और DateHelper में उन विधियों के लिए भी काम करता है जिन्हें किसी ऑब्जेक्ट के साथ बेस के रूप में कार्य करने के लिए डिज़ाइन किया गया है, जैसे ActionView::Helpers::FormOptionsHelper#collection_select और ActionView::Helpers::DateHelper#datetime_select

नेस्टेड एट्रिब्यूट्स उदाहरण हैं

जब वर्तमान क्षेत्र से संबंधित ऑब्जेक्ट में एक निश्चित विशेषता के लिए नेस्टेड विशेषता लेखक होता है, तो #fields_for उस विशेषता के लिए एक नया क्षेत्र उत्पन्न करेगा। यह आपको ऐसे रूपों को बनाने की अनुमति देता है जो एक मूल वस्तु और उसके संघों की विशेषताओं को एक बार में सेट या परिवर्तित करते हैं।

नेस्टेड विशेषता लेखक एक संघ के नाम पर सामान्य सेटर विधियां हैं। इन लेखकों को परिभाषित करने का सबसे आम तरीका या तो एक मॉडल परिभाषा में accepts_nested_attributes_for साथ है या उचित नाम के साथ एक विधि को परिभाषित करके। उदाहरण के लिए: एसोसिएशन के लिए विशेषता लेखक :address को address_attributes= कहा जाता है।

चाहे वन-टू-वन या वन-टू-कई स्टाइल फॉर्म बिल्डर का उत्पादन किया जाएगा, यह इस बात पर निर्भर करता है कि सामान्य रीडर विधि किसी एकल ऑब्जेक्ट या ऑब्जेक्ट की एक सरणी देता है या नहीं।

एक से एक

एक व्यक्ति वर्ग पर विचार करें जो address रीडर विधि से एक एकल पता लौटाता है और address_attributes= लेखक विधि का जवाब देता है:

class Person
  def address
    @address
  end

  def address_attributes=(attributes)
    # Process the attributes hash
  end
end

इस मॉडल को अब नेस्टेड #fields_for साथ प्रयोग किया जा सकता है, जैसे:

<%= form_for @person do |person_form| %>
  ...
  <%= person_form.fields_for :address do |address_fields| %>
    Street  : <%= address_fields.text_field :street %>
    Zip code: <%= address_fields.text_field :zip_code %>
  <% end %>
  ...
<% end %>

जब पता पहले से ही एक व्यक्ति पर एक संघ है तो आप अपने लिए लेखक विधि को परिभाषित करने के लिए accepts_nested_attributes_for का उपयोग कर सकते हैं:

class Person < ActiveRecord::Base
  has_one :address
  accepts_nested_attributes_for :address
end

यदि आप प्रपत्र के माध्यम से संबद्ध मॉडल को नष्ट करना चाहते हैं, तो आपको पहले इसका उपयोग करके इसे सक्षम करना होगा :allow_destroy विकल्प के लिए accepts_nested_attributes_for :

class Person < ActiveRecord::Base
  has_one :address
  accepts_nested_attributes_for :address, allow_destroy: true
end

अब, जब आप _destroy पैरामीटर के साथ एक फॉर्म एलिमेंट का उपयोग करते हैं, तो ऐसे मान के साथ जो true मूल्यांकन करता true , आप संबंधित मॉडल (जैसे। 1, '1', ट्रू या 'true') को नष्ट कर देंगे:

<%= form_for @person do |person_form| %>
  ...
  <%= person_form.fields_for :address do |address_fields| %>
    ...
    Delete: <%= address_fields.check_box :_destroy %>
  <% end %>
  ...
<% end %>

अनेको के लिये एक

एक व्यक्ति वर्ग पर विचार करें, जो projects रीडर से प्रोजेक्ट इंस्टेंस की एक सरणी लौटाता है और प्रॉजेक्ट्स के प्रति प्रतिक्रिया करता है_attributes projects_attributes= लेखक विधि:

class Person
  def projects
    [@project1, @project2]
  end

  def projects_attributes=(attributes)
    # Process the attributes hash
  end
end

ध्यान दें कि #fields_for projects_attributes= लेखक विधि वास्तव में सही पहचान करने के लिए #fields_for लिए आवश्यक है :projects संग्रह के रूप में :projects , और फॉर्म मार्कअप में सेट किए जाने वाले सही सूचकांक।

जब परियोजनाएं पहले से ही व्यक्ति पर एक संघ है, तो आप अपने लिए लेखक विधि को परिभाषित करने के लिए accepts_nested_attributes_for का उपयोग कर सकते हैं:

class Person < ActiveRecord::Base
  has_many :projects
  accepts_nested_attributes_for :projects
end

यह मॉडल अब नेस्टेड फ़ील्ड्स के लिए उपयोग किया जा सकता है। नेस्टेड #fields_for कॉल के लिए दिया गया ब्लॉक संग्रह में प्रत्येक उदाहरण के लिए दोहराया जाएगा:

<%= form_for @person do |person_form| %>
  ...
  <%= person_form.fields_for :projects do |project_fields| %>
    <% if project_fields.object.active? %>
      Name: <%= project_fields.text_field :name %>
    <% end %>
  <% end %>
  ...
<% end %>

उपयोग किए जाने वाले उदाहरण को निर्दिष्ट करना भी संभव है:

<%= form_for @person do |person_form| %>
  ...
  <% @person.projects.each do |project| %>
    <% if project.active? %>
      <%= person_form.fields_for :projects, project do |project_fields| %>
        Name: <%= project_fields.text_field :name %>
      <% end %>
    <% end %>
  <% end %>
  ...
<% end %>

या इस्तेमाल किया जाने वाला एक संग्रह:

<%= form_for @person do |person_form| %>
  ...
  <%= person_form.fields_for :projects, @active_projects do |project_fields| %>
    Name: <%= project_fields.text_field :name %>
  <% end %>
  ...
<% end %>

यदि आप किसी भी संबंधित मॉडल को फ़ॉर्म के माध्यम से नष्ट करना चाहते हैं, तो आपको पहले इसका उपयोग करके इसे सक्षम करना होगा :allow_destroy विकल्प के लिए accepts_nested_attributes_for :

class Person < ActiveRecord::Base
  has_many :projects
  accepts_nested_attributes_for :projects, allow_destroy: true
end

यह आपको निर्दिष्ट करेगा कि कौन से मॉडल विशेषताओं में नष्ट करने के लिए हैश में _destroy पैरामीटर के लिए एक फॉर्म एलिमेंट जोड़कर ऐसे मान के साथ होता है जो true मूल्यांकन करता true (जैसे। 1, '1', सत्य या 'सही')।

<%= form_for @person do |person_form| %>
  ...
  <%= person_form.fields_for :projects do |project_fields| %>
    Delete: <%= project_fields.check_box :_destroy %>
  <% end %>
  ...
<% end %>

जब एक संग्रह का उपयोग किया जाता है तो आप सरणी में प्रत्येक वस्तु के सूचकांक को जानना चाह सकते हैं। इस प्रयोजन के लिए, index विधि FormBuilder ऑब्जेक्ट में उपलब्ध है।

<%= form_for @person do |person_form| %>
  ...
  <%= person_form.fields_for :projects do |project_fields| %>
    Project #<%= project_fields.index %>
    ...
  <% end %>
  ...
<% end %>

ध्यान दें कि #fields_for स्वचालित रूप से रिकॉर्ड की आईडी स्टोर करने के लिए एक छिपा हुआ क्षेत्र उत्पन्न करेगा। ऐसी परिस्थितियां हैं जहां इस छिपे हुए क्षेत्र की आवश्यकता नहीं है और आप इसमें शामिल कर सकते #fields_for include_id: false #fields_for को स्वचालित रूप से रेंडर करने से रोकने के लिए include_id: false

file_field (विधि, विकल्प = {}) स्रोत दिखाएं
# File actionview/lib/action_view/helpers/form_helper.rb, line 2168
def file_field(method, options = {})
  self.multipart = true
  @template.file_field(@object_name, method, objectify_options(options))
end

टेम्प्लेट को निर्दिष्ट ऑब्जेक्ट पर एक निर्दिष्ट विशेषता ( method द्वारा पहचाना गया) तक पहुँचने के लिए एक फ़ाइल अपलोड इनपुट टैग देता है ( object द्वारा पहचाना गया)। इनपुट टैग पर अतिरिक्त विकल्पों को options साथ हैश के रूप में पारित किया जा सकता है। इन विकल्पों को HTML में HTML तत्व विशेषता के रूप में दिखाया गया है जैसा कि दिखाया गया है।

एक form_for block के अंदर इस विधि का उपयोग करने से enclosing फॉर्म का एन्कोडिंग multipart/form-data सेट हो जाएगा।

विकल्प

  • टैग के लिए मानक HTML विशेषताएँ बनाता है।

  • :disabled - यदि इसे सही पर सेट किया गया है, तो उपयोगकर्ता इस इनपुट का उपयोग नहीं कर सकेगा।

  • :multiple - यदि सही पर सेट है, तो * अधिकांश अपडेट किए गए ब्राउज़रों में * उपयोगकर्ता को कई फ़ाइलों का चयन करने की अनुमति होगी।

  • :accept - यदि एक या कई माइम-प्रकारों पर सेट किया जाता है, तो उपयोगकर्ता को एक फ़ाइल चुनते समय एक फिल्टर का सुझाव दिया जाएगा। आपको अभी भी मॉडल सत्यापन सेट करने की आवश्यकता है।

उदाहरण

# Let's say that @user has avatar:
file_field(:avatar)
# => <input type="file" id="user_avatar" name="user[avatar]" />

# Let's say that @post has image:
file_field(:image, :multiple => true)
# => <input type="file" id="post_image" name="post[image][]" multiple="multiple" />

# Let's say that @post has attached:
file_field(:attached, accept: 'text/html')
# => <input accept="text/html" type="file" id="post_attached" name="post[attached]" />

# Let's say that @post has image:
file_field(:image, accept: 'image/png,image/gif,image/jpeg')
# => <input type="file" id="post_image" name="post[image]" accept="image/png,image/gif,image/jpeg" />

# Let's say that @attachment has file:
file_field(:file, class: 'file_input')
# => <input type="file" id="attachment_file" name="attachment[file]" class="file_input" />
grouped_collection_select (विधि, संग्रह, group_method, group_label_method, option_key_method, option_value_method, विकल्प = {}, html_options =}} दिखाएँ स्रोत
# File actionview/lib/action_view/helpers/form_options_helper.rb, line 846
def grouped_collection_select(method, collection, group_method, group_label_method, option_key_method, option_value_method, options = {}, html_options = {})
  @template.grouped_collection_select(@object_name, method, collection, group_method, group_label_method, option_key_method, option_value_method, objectify_options(options), @default_html_options.merge(html_options))
end

ActionView::Helpers::FormOptionsHelper#grouped_collection_select फॉर्म बिल्डरों के लिए ActionView::Helpers::FormOptionsHelper#grouped_collection_select :

<%= form_for @city do |f| %>
  <%= f.grouped_collection_select :country_id, @continents, :countries, :name, :id, :name %>
  <%= f.submit %>
<% end %>

कृपया विवरण के लिए आधार हेल्पर के दस्तावेज देखें।

Hidden_field (विधि, विकल्प = {}) स्रोत दिखाएं
# File actionview/lib/action_view/helpers/form_helper.rb, line 2130
def hidden_field(method, options = {})
  @emitted_hidden_id = true if method == :id
  @template.hidden_field(@object_name, method, objectify_options(options))
end

एक निर्दिष्ट विशेषता ( method द्वारा पहचानी गई) तक पहुँचने के लिए एक छिपा हुआ इनपुट टैग लौटाता है जो टेम्पलेट को सौंपी गई object ( object द्वारा पहचाना गया) पर होता है। इनपुट टैग पर अतिरिक्त विकल्पों को options साथ हैश के रूप में पारित किया जा सकता है। इन विकल्पों को HTML में HTML तत्व विशेषता के रूप में दिखाया गया है जैसा कि दिखाया गया है।

उदाहरण

# Let's say that @signup.pass_confirm returns true:
hidden_field(:pass_confirm)
# => <input type="hidden" id="signup_pass_confirm" name="signup[pass_confirm]" value="true" />

# Let's say that @post.tag_list returns "blog, ruby":
hidden_field(:tag_list)
# => <input type="hidden" id="post_tag_list" name="post[tag_list]" value="blog, ruby" />

# Let's say that @user.token returns "abcde":
hidden_field(:token)
# => <input type="hidden" id="user_token" name="user[token]" value="abcde" />
लेबल (विधि, पाठ = शून्य, विकल्प = {}, और ब्लॉक) स्रोत दिखाएं
# File actionview/lib/action_view/helpers/form_helper.rb, line 2025
def label(method, text = nil, options = {}, &block)
  @template.label(@object_name, method, text, objectify_options(options), &block)
end

किसी निर्दिष्ट विशेषता ( method द्वारा पहचानी गई) के लिए एक इनपुट फ़ील्ड लेबल करने के लिए सिलवाया गया टैग लेबल टेम्पलेट को सौंपी गई object ( object द्वारा पहचाना गया)। जब तक कोई अनुवाद वर्तमान I18n लोकेल (हेल्पर्स.लैबेल के माध्यम से। <मॉडलनाम> <विशेषता>) में पाया जाता है या आप इसे स्पष्ट रूप से निर्दिष्ट नहीं करते हैं, तब तक लेबल का पाठ डिफ़ॉल्ट होगा। लेबल टैग पर अतिरिक्त विकल्प विकल्पों के साथ हैश के रूप में पारित किया जा सकता है। इन विकल्पों को HTML में एक HTML तत्व विशेषता के रूप में दिखाया गया है, उदाहरण के लिए :value विकल्प के अलावा, जो #radio_button टैग के लिए लेबल को लक्षित करने के लिए डिज़ाइन किया गया है (जहां इनपुट टैग की आईडी में मान का उपयोग किया जाता है) ।

उदाहरण

label(:title)
# => <label for="post_title">Title</label>

आप मॉडल और विशेषता नामों के आधार पर अपने लेबल को स्थानीय कर सकते हैं। उदाहरण के लिए आप अपने लोकेल में निम्नलिखित को परिभाषित कर सकते हैं (जैसे en.yml)

helpers:
  label:
    post:
      body: "Write your entire text here"

जिसके बाद में परिणाम होगा

label(:body)
# => <label for="post_body">Write your entire text here</label>

स्थानीयकरण विशुद्ध रूप से विशेषता-नाम के अनुवाद पर आधारित हो सकता है (यदि आप ActiveRecord का उपयोग कर रहे हैं):

activerecord:
  attributes:
    post:
      cost: "Total cost"

label(:cost)
# => <label for="post_cost">Total cost</label>

label(:title, "A short title")
# => <label for="post_title">A short title</label>

label(:title, "A short title", class: "title_label")
# => <label for="post_title" class="title_label">A short title</label>

label(:privacy, "Public Post", value: "public")
# => <label for="post_privacy_public">Public Post</label>

label(:terms) do
  raw('Accept <a href="/terms">Terms</a>.')
end
# => <label for="post_terms">Accept <a href="/terms">Terms</a>.</label>
मल्टीपार्ट = (मल्टीपार्ट) स्रोत दिखाएँ
# File actionview/lib/action_view/helpers/form_helper.rb, line 1637
def multipart=(multipart)
  @multipart = multipart

  if parent_builder = @options[:parent_builder]
    parent_builder.multipart = multipart
  end
end
रेडियो_बटन (विधि, tag_value, विकल्प = {}) स्रोत दिखाएं
# File actionview/lib/action_view/helpers/form_helper.rb, line 2108
def radio_button(method, tag_value, options = {})
  @template.radio_button(@object_name, method, tag_value, objectify_options(options))
end

टेम्प्लेट को निर्दिष्ट ऑब्जेक्ट पर एक निर्दिष्ट विशेषता ( method द्वारा पहचाना गया) तक पहुँचने के लिए एक रेडियो बटन टैग देता है ( object द्वारा पहचाना गया)। यदि method का वर्तमान मान tag_value तो रेडियो बटन की जाँच की जाएगी।

रेडियो बटन को चेक पास करने के लिए बाध्य करने के लिए checked: true options में checked: true हैश। आप वहाँ भी HTML विकल्प पास कर सकते हैं।

# Let's say that @post.category returns "rails":
radio_button("category", "rails")
radio_button("category", "java")
# => <input type="radio" id="post_category_rails" name="post[category]" value="rails" checked="checked" />
#    <input type="radio" id="post_category_java" name="post[category]" value="java" />

# Let's say that @user.receive_newsletter returns "no":
radio_button("receive_newsletter", "yes")
radio_button("receive_newsletter", "no")
# => <input type="radio" id="user_receive_newsletter_yes" name="user[receive_newsletter]" value="yes" />
#    <input type="radio" id="user_receive_newsletter_no" name="user[receive_newsletter]" value="no" checked="checked" />
चयन करें (विधि, विकल्प = शून्य, विकल्प = {}, html_options = {}, और ब्लॉक) दिखाएँ स्रोत
# File actionview/lib/action_view/helpers/form_options_helper.rb, line 822
def select(method, choices = nil, options = {}, html_options = {}, &block)
  @template.select(@object_name, method, choices, objectify_options(options), @default_html_options.merge(html_options), &block)
end

Wraps ActionView::Helpers::FormOptionsHelper#select फॉर्म बिल्डरों के लिए ActionView::Helpers::FormOptionsHelper#select :

<%= form_for @post do |f| %>
  <%= f.select :person_id, Person.all.collect { |p| [ p.name, p.id ] }, include_blank: true %>
  <%= f.submit %>
<% end %>

कृपया विवरण के लिए आधार हेल्पर के दस्तावेज देखें।

सबमिट करें (मान = शून्य, विकल्प = {}) स्रोत दिखाएं
# File actionview/lib/action_view/helpers/form_helper.rb, line 2200
def submit(value = nil, options = {})
  value, options = nil, value if value.is_a?(Hash)
  value ||= submit_default_value
  @template.submit_tag(value, options)
end

दिए गए फॉर्म के लिए सबमिट बटन जोड़ें। जब कोई मूल्य नहीं दिया जाता है, तो यह जांचता है कि क्या वस्तु एक नया संसाधन है या नहीं उचित लेबल बनाने के लिए:

<%= form_for @post do |f| %>
  <%= f.submit %>
<% end %>

ऊपर दिए गए उदाहरण में, अगर @post एक नया रिकॉर्ड है, तो यह सबमिट बटन के रूप में "पोस्ट बनाएँ" का उपयोग करेगा; अन्यथा, यह "अपडेट पोस्ट" का उपयोग करता है।

उन लेबल को I18n का उपयोग helpers.submit कुंजी के तहत और अनुवाद प्रक्षेप के लिए %{model} का उपयोग करके अनुकूलित किया जा सकता है:

en:
  helpers:
    submit:
      create: "Create a %{model}"
      update: "Confirm changes to %{model}"

यह दिए गए ऑब्जेक्ट के लिए एक विशेष कुंजी की खोज करता है:

en:
  helpers:
    submit:
      post:
        create: "Add %{model}"
time_select (विधि, विकल्प = {}, html_options = {}) स्रोत दिखाएं
# File actionview/lib/action_view/helpers/date_helper.rb, line 1139
def time_select(method, options = {}, html_options = {})
  @template.time_select(@object_name, method, objectify_options(options), html_options)
end

Wraps ActionView::Helpers::DateHelper#time_select फॉर्म बिल्डरों के लिए:

<%= form_for @race do |f| %>
  <%= f.time_select :average_lap %>
  <%= f.submit %>
<% end %>

कृपया विवरण के लिए आधार हेल्पर के दस्तावेज देखें।

time_zone_select (विधि, प्राथमिकता_ज़ोन = शून्य, विकल्प = {}, html_options = {}) दिखाएँ स्रोत
# File actionview/lib/action_view/helpers/form_options_helper.rb, line 858
def time_zone_select(method, priority_zones = nil, options = {}, html_options = {})
  @template.time_zone_select(@object_name, method, priority_zones, objectify_options(options), @default_html_options.merge(html_options))
end

Wraps ActionView::Helpers::FormOptionsHelper#time_zone_select बिल्डरों के लिए:

<%= form_for @user do |f| %>
  <%= f.time_zone_select :time_zone, nil, include_blank: true %>
  <%= f.submit %>
<% end %>

कृपया विवरण के लिए आधार हेल्पर के दस्तावेज देखें।

# File actionview/lib/action_view/helpers/form_helper.rb, line 1653
def to_model
  self
end
# File actionview/lib/action_view/helpers/form_helper.rb, line 1649
def to_partial_path
  self.class._to_partial_path
end

Original text