복붙노트

[RUBY-ON-RAILS] 레일 : 인덱스 fields_for?

RUBY-ON-RAILS

레일 : 인덱스 fields_for?

fields_for_with_index을 수행하는 (비슷한 기능을 해내 또는 방법)하는 방법이 있습니까?

예:

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

부분 존재 렌더링 요구는 현재 인덱스가 fields_for 루프 무엇인지 알고있다.

해결법

  1. ==============================

    1.이것은 실제로 더 가깝게 레일 문서 다음, 더 나은 방법이 될 것입니다 :

    이것은 실제로 더 가깝게 레일 문서 다음, 더 나은 방법이 될 것입니다 :

    <% @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/classes/ActionView/Helpers/FormHelper.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 %>
    
  2. ==============================

    2.이 솔루션은 레일 내에서 제공 될 때 그 대답은 매우 간단합니다. 당신은 f.options의 PARAMS를 사용할 수 있습니다. 그래서, 당신의 렌더링 _some_form.html.erb 내부,

    이 솔루션은 레일 내에서 제공 될 때 그 대답은 매우 간단합니다. 당신은 f.options의 PARAMS를 사용할 수 있습니다. 그래서, 당신의 렌더링 _some_form.html.erb 내부,

    인덱스에 액세스 할 수 있습니다 :

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

    당신은 다른 작업을 수행 할 필요가 없습니다.

    업데이트 : 그것은 내 대답은 분명 충분히 아니었다 것 같다 ...

  3. ==============================

    3.레일 4.0.2로, 인덱스는 이제 FormBuilder 객체에 포함되어 있습니다 :

    레일 4.0.2로, 인덱스는 이제 FormBuilder 객체에 포함되어 있습니다 :

    http://apidock.com/rails/v4.0.2/ActionView/Helpers/FormHelper/fields_for

    예를 들면 :

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

    4.레일 4+

    레일 4+

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

    원숭이 패치 3 지원 레일

    레일 3 일에 f.index를 얻으려면 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
    
  5. ==============================

    5.체크 아웃은 부분 지문의 컬렉션을 렌더링. 귀하의 요구 사항 템플릿 배열을 반복해야하고 각 요소에 대한 서브 템플릿을 렌더링하는 것이됩니다.

    체크 아웃은 부분 지문의 컬렉션을 렌더링. 귀하의 요구 사항 템플릿 배열을 반복해야하고 각 요소에 대한 서브 템플릿을 렌더링하는 것이됩니다.

    <%= 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 될 것이다.

    도움이 되었기를 바랍니다.

  6. ==============================

    6.나는 -v3.2.14에 적어도, 레일에서 제공하는 방법을 통해이 작업을 수행 할 수있는 괜찮은 방법을 볼 수 없습니다

    나는 -v3.2.14에 적어도, 레일에서 제공하는 방법을 통해이 작업을 수행 할 수있는 괜찮은 방법을 볼 수 없습니다

    @Sheharyar Naseer 문제를 해결하는 데 사용하지만이 방법으로 볼 수없는까지 그가 제안하는 것 같다 수있는 옵션 해시를 참조한다.

    내가 한이 =>

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

    7.이 같은 fields_for의 인덱스를 얻을 수 있습니다 나는이 조금 늦은 것을 알고 있지만 나는 최근에이 작업을 수행했다

    이 같은 fields_for의 인덱스를 얻을 수 있습니다 나는이 조금 늦은 것을 알고 있지만 나는 최근에이 작업을 수행했다

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

    난이 도움이되기를 바랍니다 :)

  8. ==============================

    8.fields_for CHILD_INDEX 추가 수 : 0

    fields_for CHILD_INDEX 추가 수 : 0

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

    9.당신이 인덱스를 제어 할하려면 인덱스 옵션을 체크 아웃

    당신이 인덱스를 제어 할하려면 인덱스 옵션을 체크 아웃

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

    양식이 제출되면, PARAMS 같은 것을 포함 할 것이다

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

    나는 일에 내 멀티 드롭 다운을 얻을 수있는 인덱스 옵션을 사용했다. 행운을 빕니다.

  10. from https://stackoverflow.com/questions/4853373/rails-fields-for-with-index by cc-by-sa and MIT license