রেলস: ক্ষেত্র_সীমা অনুসারে?


103

এটি করার কোনও পদ্ধতি আছে (বা অনুরূপ কার্যকারিতা বন্ধ করার উপায়) কি fields_for_with_index?

উদাহরণ:

<% f.fields_for_with_index :questions do |builder, index| %>  
  <%= render 'some_form', :f => builder, :i => index %>
<% end %>

যে আংশিক রেন্ডার করা হচ্ছে তা বর্তমান সূচি লুপটিতে কী তা জানতে হবে fields_for


4
আমি এটির মূল রেলগুলিতে একটি করতাম ... এটির জন্যও একটি কেস জুড়ে রাখুন।
নাথান বার্ট্রাম

উত্তর:


93

আধুনিক পদ্ধতির জন্য নীচের উত্তরটি বহু বছর আগে পোস্ট করা হয়েছিল: দেখুন https://stackoverflow.com/a/22640703/105403


রেলের ডকুমেন্টেশনগুলি আরও ঘনিষ্ঠভাবে অনুসরণ করা এটি আসলে আরও ভাল উপায় হবে:

<% @questions.each.with_index do |question,index| %>
    <% f.fields_for :questions, question do |fq| %>  
        # here you have both the 'question' object and the current 'index'
    <% end %>
<% end %>

থেকে: http://railsapi.com/doc/rails-v3.0.4/class/ActionView/ হেলপারস / ফার্মহেল্পার html#M006456

এটি ব্যবহারের জন্য উদাহরণটি উল্লেখ করাও সম্ভব:

  <%= 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 %>

4
আমি আশা করি এর জন্য ক্ষেত্রগুলিতে কিছু নির্মিত হয়েছিল, তবে যেহেতু আপনার উত্তরটি আমার দিনটি রক্ষা করতে পারেনি। ধন্যবাদ
অ্যান্ডারস কিন্ডবার্গ

4
আপনি অনির্ধারিত বিকল্পটিও ব্যবহার করতে পারেন: ফিল্ড_এর জন্য চাইল্ড_আইএনডেক্স, যদি কোন সূচকটি রেন্ডার করা হয় তার উপরে যদি আপনার আরও নিয়ন্ত্রণের প্রয়োজন হয় তবে: ক্ষেত্র_দুটি (: প্রকল্পগুলি, প্রকল্প, শিশু-ইন্ডেক্স: সূচক)
এন্ডারস কিন্ডবার্গ

8
রেলগুলি 4.0.০.২++ ব্যবহারকারীদের বেনের উত্তরটি পরীক্ষা করা উচিত কারণ এখন সূচকটি বিল্ডারে তৈরি করা হয়েছে।
নোটপ্যাচ

4
@ মার্কো আপনি রাজা স্যার তুমি আমার দিনকে বাঁচিয়েছ :-) আমি আপনাকে 10 + + দম্পতি দিতে পারতাম ......!

4
এই উত্তরটির সম্পাদনা করা উচিত এবং নোটপ্যাच অনুযায়ী বেনের উত্তরটি আপডেট করা উচিত
জজপ্রপেট

157

উত্তরটি বেশ সহজ কারণ সমাধানটি রেলের মধ্যে সরবরাহ করা হয়েছে। আপনি f.optionsপ্যারাম ব্যবহার করতে পারেন । সুতরাং, আপনার রেন্ডারের ভিতরে _some_form.html.erb,

সূচকটি দ্বারা প্রবেশ করা যেতে পারে:

<%= f.options[:child_index] %>

আপনার আর কিছু করার দরকার নেই।


আপডেট: দেখে মনে হচ্ছে আমার উত্তর যথেষ্ট পরিষ্কার ছিল না ...

আসল এইচটিএমএল ফাইল:

<!-- Main ERB File -->
<% f.fields_for :questions do |builder| %>  
  <%= render 'some_form', :f => builder %>
<% end %>

উপ-ফর্মটি সরবরাহ করা হয়েছে:

<!-- _some_form.html.erb -->
<%= f.options[:child_index] %>

10
এটা এখানে কাজ করছে না। আপনি কি রেল ডকুমেন্টেশন লিঙ্ক সরবরাহ করতে পারেন?
লুকাস রেনান

4
@ লুকাশেনেন এবং @ অনুচ্ছেদ - অনুগ্রহ করে প্রশ্নটি আবার পড়ুন, আপনাকে <%= f.options[:child_index] %>আপনার রেন্ডার উপ-ফর্মটিতে কল করতে হবে (এই ক্ষেত্রে: _সোম_ফর্ম.এইচটিএমএল.বার্ব), মূলটি নয় builder। আরও স্পষ্টতার জন্য উত্তর আপডেট হয়েছে।
শেহেরিয়ার

4
অদ্ভুত, আমি তার nilজন্য
পেয়েছি

4
@ শেহারিয়ার এটি রেল ৪ এ কাজ করছে But তবে এটি আমাকে '1450681048049,1450681050158,1450681056830,1450681141951,1450681219262' এর মতো মান দিচ্ছে। তবে এই ফর্মটিতে আমাকে '1,2,3,4,5' ইনডেক্স দরকার। আমার কি করা উচিৎ?
Vidal

4
উজ্জ্বল। এটি অবশ্যই গ্রহণযোগ্য উত্তর হওয়া উচিত।
jeffdill2

103

রেলস 4.0.2 হিসাবে, একটি সূচক এখন ফর্ম বিল্ডার অবজেক্টে অন্তর্ভুক্ত করা হয়েছে:

https://api.rubyonrails.org/class/ActionView/Helpers/FormBuilder.html#method-i-fields_for

উদাহরণ স্বরূপ:

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

4
এটি কাজ করে এবং কম লেখার চেয়ে কম project_fields.options[:child_index]। সুতরাং আমি এই উপায় ভাল পছন্দ!
কেসি

17

রেল 4+ এর জন্য

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

রেলগুলির জন্য বানর প্যাচ 3 সহায়তা

পেতে f.indexপাগল 3 কাজে আপনাকে এই কার্যকারিতা যোগ করার জন্য আপনার প্রকল্পের initializers একটি বানর প্যাচ যোগ করতে হবেfields_for

# config/initializers/fields_for_index_patch.rb

module ActionView
  module Helpers
    class FormBuilder

      def index
        @options[:index] || @options[:child_index]
      end

      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[:parent_builder] = self
        fields_options[:namespace] = options[:namespace]

        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   = ActiveModel::Naming.param_key(record_object)
        end

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

        record_name = index ? "#{object_name}[#{index}][#{record_name}]" : "#{object_name}[#{record_name}]"
        fields_options[:child_index] = index

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

      def fields_for_with_nested_attributes(association_name, association, options, block)
        name = "#{object_name}[#{association_name}_attributes]"
        association = convert_to_model(association)

        if association.respond_to?(:persisted?)
          association = [association] if @object.send(association_name).is_a?(Array)
        elsif !association.respond_to?(:to_ary)
          association = @object.send(association_name)
        end

        if association.respond_to?(:to_ary)
          explicit_child_index = options[:child_index]
          output = ActiveSupport::SafeBuffer.new
          association.each do |child|
            options[:child_index] = nested_child_index(name) unless explicit_child_index
            output << fields_for_nested_model("#{name}[#{options[:child_index]}]", child, options, block)
          end
          output
        elsif association
          fields_for_nested_model(name, association, options, block)
        end
      end

    end
  end
end

এখন পর্যন্ত আরও ভাল উত্তর, ব্যবহার .indexঅনেক পরিষ্কার er
লুকাস এন্ড্রেড

7

পার্টিয়ালের সংকলন রেকর্ডিং চেকআউট । যদি আপনার প্রয়োজন হয় যে কোনও টেম্পলেটটির একটি অ্যারের উপরে পুনরাবৃত্তি হওয়া এবং প্রতিটি উপাদানগুলির জন্য একটি উপ টেম্পলেট রেন্ডার করা দরকার।

<%= f.fields_for @parent.children do |children_form| %>
  <%= render :partial => 'children', :collection => @parent.children, 
      :locals => { :f => children_form } %>
<% end %>

এটি "_children.erb" রেন্ডার করবে এবং স্থানীয় ভেরিয়েবল 'বাচ্চাদের' প্রদর্শনের জন্য টেমপ্লেটে পাস করবে। একটি পুনরাবৃত্তি কাউন্টারটি ফর্মের নামের সাথে স্বয়ংক্রিয়ভাবে টেমপ্লেটে উপলব্ধ করা হবে partial_name_counter। উপরের উদাহরণের ক্ষেত্রে, টেমপ্লেটটি খাওয়ানো হবে children_counter

আশাকরি এটা সাহায্য করবে.


এটি করার সময় আমি "অপরিজ্ঞাত স্থানীয় পরিবর্তনশীল বা পদ্ধতি 'প্রশ্ন_কমেন্ট_রফর্ম_কাউন্টার'" পাই। question_comment_formআমার আংশিক নাম
হ'ল

প্রশ্ন করুন কি_আমি: মন্তব্যগুলি এবং আপনি কীভাবে মন্তব্যগুলি তৈরি করছেন উদাহরণস্বরূপ আপনার নতুন বা প্রশ্নগুলির সম্পাদনের ক্রিয়াকলাপে 1. টাইমস করার চেষ্টা করুন {প্রশ্ন.কমেন্টস.বিল্ড}
সৈয়দ আসলাম

5

কমপক্ষে -v3.2.14-এ নয়, রেলগুলির সরবরাহিত উপায়গুলির মাধ্যমে এটি করার জন্য আমি একটি শালীন উপায় দেখতে পাচ্ছি না

@ শেহেরিয়ার নাসির বিকল্পগুলির হ্যাশগুলির বিষয়ে উল্লেখ করেছেন যা সমস্যার সমাধান করতে ব্যবহার করা যেতে পারে তবে তার পরামর্শ মতো মনে হচ্ছে আমি যতটা দেখতে পাচ্ছি না।

আমি এটি => করেছি

<%= f.fields_for :blog_posts, {:index => 0} do |g| %>
  <%= g.label :gallery_sets_id, "Position #{g.options[:index]}" %>
  <%= g.select :gallery_sets_id, @posts.collect  { |p| [p.title, p.id] } %>
  <%# g.options[:index] += 1  %>
<% end %>

বা

<%= f.fields_for :blog_posts do |g| %>
  <%= g.label :gallery_sets_id, "Position #{g.object_name.match(/(\d+)]/)[1]}" %>
  <%= g.select :gallery_sets_id, @posts.collect  { |p| [p.title, p.id] } %>
<% end %>

আমার ক্ষেত্রে তৃতীয় ক্ষেত্রের জন্য রেন্ডার করা g.object_nameএই জাতীয় একটি স্ট্রিং "gallery_set[blog_posts_attributes][2]"প্রদান করে তাই আমি কেবল সেই স্ট্রিংয়ের সূচকটি মেলে এবং এটি ব্যবহার করি।


আসলে একটি কুলার (এবং সম্ভবত ক্লিনার?) এটি করার উপায় হ'ল ল্যাম্বদা পাস করা এবং এটিকে ইনক্রিমেন্টে কল করা।

# /controller.rb
index = 0
@incrementer = -> { index += 1}

এবং দেখুন

<%= f.fields_for :blog_posts do |g| %>
  <%= g.label :gallery_sets_id, "Position #{@incrementer.call}" %>
  <%= g.select :gallery_sets_id, @posts.collect  { |p| [p.title, p.id] } %>
<% end %>

2

চাইল্ড_আইএনডেক্সের জন্য ফিল্ডে যুক্ত হয়েছে: 0

<%= form_for @person do |person_form| %>
  <%= person_form.fields_for :projects, child_index: 0 do |project_fields| %>
    <%= project_fields.index %>
  <% end %>
<% end %>

এটি নতুন সেরা উত্তর।
Genkilabs

অন্য কেউ এর সাথে নকল ক্ষেত্র পেতে পারে?

1

আমি জানি যে এটি কিছুটা দেরি হয়ে গেছে তবে আমি সম্প্রতি এটি করতে হয়েছিল আপনি ক্ষেত্রের সূচি পেতে পারেন_এর মতো

<% f.fields_for :questions do |builder| %>
  <%= render 'some_form', :f => builder, :i => builder.options[:child_index] %>
<% end %>

আমি আশাবাদী এটা সাহায্য করবে :)


0

আপনি যদি সূচকের উপর নিয়ন্ত্রণ রাখতে চান তবে indexবিকল্পটি পরীক্ষা করে দেখুন

<%= f.fields_for :other_things_attributes, @thing.other_things.build do |ff| %>
  <%= ff.select :days, ['Mon', 'Tues', 'Wed'], index: 2 %>
  <%= ff.hidden_field :special_attribute, 24, index: "boi" %>
<%= end =>

এটি উত্পাদন করবে

<select name="thing[other_things_attributes][2][days]" id="thing_other_things_attributes_7_days">
  <option value="Mon">Mon</option>
  <option value="Tues">Tues</option>
  <option value="Wed">Wed</option>
</select>
<input type="hidden" value="24" name="thing[other_things_attributes][boi][special_attribute]" id="thing_other_things_attributes_boi_special_attribute">

যদি ফর্মটি জমা দেওয়া হয় তবে প্যারামগুলিতে এর মতো কিছু অন্তর্ভুক্ত থাকবে

{
  "thing" => {
  "other_things_attributes" => {
    "2" => {
      "days" => "Mon"
    },
    "boi" => {
      "special_attribute" => "24"
    }
  }
}

আমার মাল্টি-ড্রপডাউনগুলি কাজ করতে আমাকে সূচক বিকল্পটি ব্যবহার করতে হয়েছিল। শুভকামনা।

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