- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我很好奇如何正确使用 accepts_nested_attributes_for
和 f.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">→ <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 请求:
构建
功能使用 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
你最好的 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/
我正在学习 RoR 并且我正在尝试找到如何使用 has_one 模型在另一个模型中设置 fields_for ,如下所示: class Child mother:
我怎样才能实现这样的目标? 结构是 => 一个测试有很多问题,一个问题有很多答案。 我在 Controller 中有 questions = @test.questions.build 和 quest
在我的 我有一个nested_form,如: { :action => "new" } do |build| %> build %> 在nested_field 里面,我有另一个fiel
在我的第一个 Rails 应用程序中,我尝试使用 form_for 和 fields_for 创建嵌套对象表单。到目前为止一切顺利,但我不知道如何在 fields_for block 中访问子对象。我
我正在以一种形式在索引 View 中编辑父模型的多个实例,如 Railscasts #198 中所示。每个父节点 has_many :children 和 Accepts_nested_attribu
我有一个 AJAX 调用: $('#enrollment_members').change(function(){ var memberNumber = $(this); $.ajax({type:
我的表单中有这个 fields_for : = f.fields_for :parts do |builder| = builder.input :body, label: builder.obj
我有具有一组值的动态表单。我创建了一个部分,其中包含我显示的文本字段。在他们每个人旁边,我想显示一个包含文本标题的标签。例如名字和姓氏以前是未知的。我该怎么做? 似乎我无法直接访问属性。但是当我使用标
我正在构建一个动态表单生成器。我遇到了一个似乎无法解决的问题。 所以我有一个名为“forms”的数据库表表单可以有“字段”.. 问题是,当用户创建一个新的“字段”(单击添加字段)时,它应该为该字段使用
我在 SO 上看到过几个类似的问题,但它们没有完全涵盖我的问题。 我有一个带有嵌套字段的非常基本的表单,问题是,当这些嵌套表单中出现任何验证错误时,所有 fields_for 字段都将重置为其原始值。
我希望我遗漏了一些明显的东西。我想看看可用的 options 是什么,您可以通过 options 哈希参数将它们传递给 rails fields_for 方法。 我查看了 fields_for doc
有什么方法可以访问嵌套的 form_bulder.object? ## controller @project = Project.new @project.tasks.build form_for(
我正在尝试创建一个嵌套表单来处理 has_many :through 关系并获取正在呈现的重复字段。 型号 公司 has_many :provides has_many :services, :thr
我使用的是嵌套属性,但 View 中未加载字段。 有人知道我想念什么吗? Rails 3.1,Ruby 1.9.2 模型1: class Traditions::Material :destroy
通常,当我在一个简单的 has_many 关联上使用 fields_for 时,表单上的输入名称类似于 foo[bars_attributes][0][name ],但在我的例子中,它没有在表单上显示
我有一个带有嵌套 fields_for 的表单。我试图允许由该嵌套表单生成的参数,但它们被强参数阻止了。我正在使用 rails 4.2.4 和 ruby 2.2.2 我看过一些官方文档: http
我有一个嵌套表单问题。我实现了 railscasts 196 和 197 的嵌套表单解决方案。如果我没有验证错误,它就可以工作。 因此,表单在加载时呈现完美,包括嵌套字段(在 fields_for 部
我正在尝试创建一个表单,该表单允许我为关联输入分组的关联提交新记录。 class Product false . 以下 fields_for给我正确的输入名称,例如 product[prope
在以下场景中,我需要检查 fields_for 中的 object 属性的值。环形。 :hidden %> 在循环中,:review_criteria_id呈现为隐藏字段,但我有一个场景,如果
在我看来,我正在使用 fields_for 来显示关系表的表单数据。然而,此表格的一部分将有可供选择的选择列表。我看到 form_for 和 fields_for 帮助程序有 label、text_f
我是一名优秀的程序员,十分优秀!