복붙노트

[RUBY-ON-RAILS] f.fields_for 및 AJAX와 accepts_nested_attributes_for 레일

RUBY-ON-RAILS

f.fields_for 및 AJAX와 accepts_nested_attributes_for 레일

나는 제대로 accepts_nested_attributes_for 및 f.fields_for 사용하는 방법에 대해 궁금합니다.

보기 / 주문 / new.html.erb

<%= form_for @order, html:{role: "form"} do |f| %>

  <%= f.submit "Don't push...", remote: true %>
  <%= f.text_field :invoice %>
  <%= f.text_field :ordered_on %>
  <%= f.text_field :delivered_on %>

  <table  id='order_form'>
    <h3>Details</h3>
    <tbody>
      <%= render 'order_details/details', f: f %>
    </tbody>
    <%= link_to 'add line', new_order_detail_path(company_id: params[:company_id]), remote: true %>
    <%= link_to 'new box', new_box_path, remote: true %>
  </table>

<% end %>

전경 / ORDER_DETAILS / _details.html.erb

<tr class='row0'>
  <%= f.fields_for :order_details, child_index: child_index do |d| %>
    <td><%= d.collection_select :box_id, @boxes, :id, :uid, {},
                                { name: "box_id", class: 'form-control'} %></td>
    <td><%= d.text_field :quantity, class: 'form-control' %></td>
    <td><%= d.text_field :box_price, class: 'form-control' %></td>
    <td><%= d.text_field :cb_price, class: 'form-control' %></td>
    <td><%= d.text_field :mould_fees, class: 'form-control' %></td>
    <td>$$$</td>
  <% end %>
</tr>
<tr class='box0'>
  <td colspan="6">&#8594; <b><%= @b.uid %></b> | length: <%= @b.length %> | width: <%= @b.width %> | height: <%= @b.height %> | weight: <%= @b.weight %></td>
</tr>

컨트롤러 / orders_controller.rb (나는 확신이 잘못 해요 ... 여기에 어떤 도움을 주시면 감사하겠습니다)

def create
  @order = Order.create(params[:order])
  if @order.save
    flash[:success] = "Order #{@order.invoice} added!"
    redirect_to current_user      
  else
    render 'orders/new'
  end
end

모델 / order.rb

class Order < ActiveRecord::Base
  attr_accessible ..., :order_details_attributes
  has_many :order_details
  accepts_nested_attributes_for :order_details
end

실제로 Order.new.order_details.build fields_for로 fields_for를 호출하면 내가 플레이 좋은으로이 부분 얻을 수 있었던 유일한 방법입니다. 그러나 그것은 전혀 중첩 된 객체를 구축하지 않습니다. 내가 주문하고 OrderDetail을 구축하기 위해 f.fields_for 명칭을 사용해야합니다. 난 단지 생각 하나 구축 할 수 있습니다. 어떤 내 다음 문제입니다.

거기에 버튼이 있습니다 방법을 참조하십시오 이 양식에 행을 AJAXs. 당신이 추가 라인을 클릭하면, 내가 얻을

NameError in Order_details#new
Showing D:/Dropbox/Apps/rails_projects/erbv2/app/views/order_details/new.js.erb where line #3 raised:
undefined local variable or method `f' for #<#<Class:0x5cf0a18>:0x5cbd718>

보기 / 주문 / add_detail.js.erb

$('#order_form tr.total').before("<%= j render partial: 'orders/details', locals: {f: @f, child_index: @ci} %>")

내 부분 필요로하는 FormBuilder 인스턴스와 몇 가지 다른 : 나는 F를 정의하는 방법을 모른다 ... 나는 레일 AJAX를 체크 아웃.

나는이 문제를 처리하는 방법에 대한 어떤 제안? 내가 여기에있는 코드를 사용하여 ... 나는 관련 ORDER_DETAILS와 함께, 새로운 질서를 만들 수 있었다, 그러나 box_id는 저장하지 않았고, COMPANY_ID 저장하지 않았다. 나는이 종류의 불쾌한의 알고,하지만 난 다른 어디를 가야할지하지 않습니다.

최신 정보

경로 :

resources :orders do
  collection { get :add_detail }
end

this is way better than having a separate resource for the details.  I didn't think of this before!

HTML 양식 :

<%= form_for @order, company_id: params[:company_id], html:{role: "form"} do |f| %>
  f. ...
  <%= render partial: 'details', locals: { f: f } %> #first child
  <%= link_to 'add line', add_detail_orders_path(company_id: params[:company_id]), remote: true %> #add subsequent children
<% end %>

주문 컨트롤러 :

def add_detail
  @order = Order.build
  @boxes = Company.find(params[:company_id]).boxes
  @b = @boxes.first
  @ci = Time.now.to_i
  respond_with(@order, @boxes, @b, @ci)
end

부분 _details

<%= form_for @order do |f| %>
  <%= f.fields_for :order_details, child_index: @ci do |d| %>
    <td><%= d.collection_select :box_id, @boxes, :id, :uid, {},
                                {class: 'form-control'} %></td>
    <td><%= d.text_field :quantity, class: 'form-control' %></td>
    <td><%= d.text_field :box_price, class: 'form-control' %></td>
    <td><%= d.text_field :cb_price, class: 'form-control' %></td>
    <td><%= d.text_field :mould_fees, class: 'form-control' %></td>
    <td>$$$</td>
  <% end %>
<% end %>

해결법

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

    1.것이 가능하다

    것이 가능하다

    이에 아주, 아주 좋은 자습서는 여기있다 : http://pikender.in/2013/04/20/child-forms-using-fields_for-through-ajax-rails-way/

    우리는 또한 최근에 우리의 개발 애플 리케이션 중 하나에 형태의이 유형을 구현했습니다. 당신이 고토 & http://emailsystem.herokuapp.com 경우, 가입 (무료)와 "새 메시지"를 클릭합니다. 은 "가입자"부분은이 기술을 사용하여

    BTW 우리는이 수동으로했다. 코쿤은 실제로 정말 좋아 보인다, 우리와 같은 원리를 사용하는 것 같다. 거기에 RailsCast도하지만 이것은 단지 (내가 생각하는) 하나의 추가 작동

    f.fields_for

    당신이 그것을 할 방법은 동적으로 당신이 필요로하는 분야를 구축 부분 지문의 시리즈를 사용하는 것입니다. 그렇게 지금은 AJAX 요청을 처리하기 위해 여러 구성 요소를 구축하는 경우가있어, (양식이 작동) 장소에 기초를 가지고있는 것처럼 코드에서, 그것은 같습니다 :

    컨트롤러와 AJAX 처리

    첫째, 당신은 컨트롤러에서 Ajax 요청을 처리 할 필요가

    이렇게하려면, 당신은 경로에 새로운 "엔드 포인트"를 추가해야합니다. 이것은 우리입니다 :

     resources :messages, :except => [:index, :destroy] do
        collection do
           get :add_subscriber
        end
     end
    

    컨트롤러 액션으로 변환 후 :

    #app/controllers/messages_controller.rb
    #Ajax Add Subscriber
    def add_subscriber
        @message = Message.build
        render "add_subscriber", :layout => false
    end
    

    파셜으로 당신의 f.fields_for 추가

    이 문제를 처리하기 위해, 당신은 파셜로 f.fields_for을 넣어해야합니다. 여기에 우리의 양식을 형성하는 코드는 다음과 같습니다

    #app/views/resources/_message_subscriber_fields.html.erb
    <%= f.fields_for :message_subscribers, :child_index => child_index do |subscriber| %>
        <%= subscriber.collection_select(:subscriber_id, Subscriber.where(:user_id => current_user.id), :id, :name_with_email, include_blank: 'Subscribers') %>
    <% end %>
    
    #app/views/messages/add_subscriber.html.erb
    <%= form_for @message, :url => messages_path, :authenticity_token => false do |f| %>
            <%= render :partial => "resources/message_subscriber_fields", locals: {f: f, child_index: Time.now.to_i} %>
    <% end %>
    
    #app/views/messages/new.html.erb
    <% child_index = Time.now.to_i %>
    <div id="subscribers">
        <div class="title">Subscribers</div>
        <%= render :partial => "message_subscriber_fields", locals: {f: f, child_index: child_index } %>
    </div>
    

    모델에 빌드 기능을 확장

    일 건조를 유지하기 위해, 우리는 단지 우리가 때마다 호출 할 수있는 모델의 빌드 기능을 만들었습니다 :

       #Build
        def self.build
           message = self.new
           message.message_subscribers.build
           message
        end
    

    CHILD_INDEX

    당신의 가장 친한 친구는 여기 CHILD_INDEX입니다

    여러 필드를 추가하는 경우, 큰 문제는 필드의 [ID]를 (이것은 우리가 라이언 베이츠 '튜토리얼 발견 된 결함이었다) 증가되어있을 것이다

    내가 게시 된 첫 번째 튜토리얼이 해결 방법은 Time.now.to_i과 새로운 분야의 CHILD_INDEX을 설정했다. 이 고유 ID를 설정하고, 새로운 분야의 실제 ID는 무관하기 때문에, 당신은 당신이 그것으로 원하는만큼 많은 필드로 추가 할 수 있습니다

    JQuery와

        #Add Subscriber
        $ ->
          $(document).on "click", "#add_subscriber", (e) ->
             e.preventDefault();
    
             #Ajax
             $.ajax
               url: '/messages/add_subscriber'
               success: (data) ->
                   el_to_add = $(data).html()
                   $('#subscribers').append(el_to_add)
               error: (data) ->
                   alert "Sorry, There Was An Error!"
    
  2. from https://stackoverflow.com/questions/20436526/rails-accepts-nested-attributes-for-with-f-fields-for-and-ajax by cc-by-sa and MIT license