gpt4 book ai didi

jquery - Rails accepts_nested_attributes_for 与 f.fields_for 和 AJAX

转载 作者:数据小太阳 更新时间:2023-10-29 06:39:09 24 4
gpt4 key购买 nike

我很好奇如何正确使用 accepts_nested_attributes_forf.fields_for

views/orders/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 %>

views/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>

controllers/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

models/order.rb

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

我能够让部分发挥良好的唯一方法是,如果我实际上将 fields_for 称为 fields_for Order.new.order_details.build。但这根本不会构建嵌套对象。我需要使用 f.fields_for 命名法来构建订单和 OrderDetail。不过我只能建一个。这是我的下一期。

看到那里有按钮了吗?它通过 AJAX 将行放入表单中。如果你点击add line,我得到

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>

views/orders/add_detail.js.erb

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

我不知道如何定义f...我查看了Rails AJAX: My partial needs a FormBuilder instance和其他一些人。

关于我应该如何处理这个问题有什么建议吗?使用我这里的代码...我能够创建一个新订单,具有关联的 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 %>

订单 Controller :

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

_部分细节

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

最佳答案

这是可能的

这里有一个非常非常好的教程:http://pikender.in/2013/04/20/child-forms-using-fields_for-through-ajax-rails-way/

我们最近还在我们的一个开发应用程序中实现了这种类型的表单。如果您转到 & http://emailsystem.herokuapp.com ,注册(免费)并点击“新消息”。 “订阅者”部分使用了这种技术

顺便说一句,我们是手动完成的。 Cocoon 看起来真的很不错,似乎和我们使用的原理一样。还有一个 RailsCast ,但这只适用于单次添加(我认为)


f.fields_for

你这样做的方法是使用一系列动态构建你需要的字段的部分。从您的代码来看,您似乎已经掌握了基础知识(表单正在运行),所以现在需要构建多个组件来处理 AJAX 请求:

  1. 您需要在 Controller 上处理 AJAX(路由 + Controller 操作)
  2. 你需要将你的 f.fields_for 放入 partials(这样它们就可以被 Ajax 调用)
  3. 您需要处理模型中的构建功能

使用 Controller 处理 AJAX

首先,您需要在 Controller 中处理Ajax 请求

为此,您需要向路由添加一个新的“端点”。这是我们的:

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

然后 Controller Action 转化为:

#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 放入 partials 中。这是我们表单的代码:

#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 函数,我们每次都可以调用它:

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

Child_Index

你最好的 friend 是 child_index

如果您要添加多个字段,您将遇到的大问题是增加字段的 [id](这是我们在 Ryan Bates 的教程中发现的缺陷)

我发布的第一个教程解决这个问题的方法是使用 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!"

关于jquery - Rails accepts_nested_attributes_for 与 f.fields_for 和 AJAX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20436526/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com