[RUBY-ON-RAILS] f.fields_for 및 AJAX와 accepts_nested_attributes_for 레일
RUBY-ON-RAILSf.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">→ <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.것이 가능하다
것이 가능하다
이에 아주, 아주 좋은 자습서는 여기있다 : 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!"
from https://stackoverflow.com/questions/20436526/rails-accepts-nested-attributes-for-with-f-fields-for-and-ajax by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 활성 레코드와 여러 테이블에 참여 (0) | 2020.02.14 |
---|---|
[RUBY-ON-RAILS] 크롬 순 :: ERR_INCOMPLETE_CHUNKED_ENCODING 만 (0) | 2020.02.14 |
[RUBY-ON-RAILS] 어떻게 sqlite3를 "기본 값 NULL과 NOT NULL 열을 추가 할 수 없습니다"해결하기 위해? (0) | 2020.02.14 |
[RUBY-ON-RAILS] Process.fork를 대체 Process.spawn 사용 (0) | 2020.02.14 |
[RUBY-ON-RAILS] 레일 2 : Model.find (1) ID 1이 존재하지 않는 액티브 오류를 제공합니다 (0) | 2020.02.14 |