我很好奇如何正确使用acceptance_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>

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

车型/ 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命名来构建Order和OrderDetail.我只能建一个.我的下一个问题是哪个

看看那里有按钮吗?它将AJAX的行进入表单.如果你点击添加行,我得到

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} %>")

我不知道如何定义f …我检查了Rails AJAX: My partial needs a FormBuilder instance和其他几个.

关于我应该怎么处理这个的任何建议?使用我在这里的代码…我能够创建一个新的订单,与一个关联的order_details,但是Box_id没有保存,而company_id没有保存.我知道这很讨厌,但我不知道去哪里.

UPDATE

路线:

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,@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,{class: 'form-control'} %></td>
    <td><%= d.text_field :quantity,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,注册(免费),然后点击“新消息”. “订阅者”部分使用此技术

BTW我们这样做了.茧实际上看起来真的很好,似乎使用与我们一样的原则.还有一个RailsCast,但这只适用于单个添加(我想)

f.fields_for

您所做的方式是使用一系列部分动态构建所需的字段.从您的代码看,您的基础知识(表单正在运行)看起来像现在这样构建几个组件以处理AJAX请求的情况:

>您需要处理控制器上的AJAX(路由控制器动作)
>你需要把你的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),: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",child_index: child_index } %>
</div>

将您的构建功能扩展到您的模型

为了保持干燥,我们在模型中创建了一个构建函数,每次我们可以调用它们:

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

Child_Index

你最好的朋友是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 – 使用f.fields_for和AJAX,Rails accept_nested_attributes_for的更多相关文章

  1. HTML5新增form控件和表单属性实例代码详解

    这篇文章主要介绍了HTML5新增form控件和表单属性实例代码详解,需要的朋友可以参考下

  2. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. HTML5表单验证特性(知识点小结)

    这篇文章主要介绍了HTML5表单验证特性的一些知识点,本文通过实例代码截图的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  4. amazeui页面分析之登录页面的示例代码

    这篇文章主要介绍了amazeui页面分析之登录页面的示例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. 在IOS9中的Cordova应用程序使用JQuery / Javascript的window.history问题

    在两个测试用例中唯一改变的是Cordova.js.解决方法我看到这是几个星期前,但我会发布这个,以防其他人遇到它.听起来它可能与iOS9中的哈希更改生成的导航事件有关.如果是这样,可以将其添加到index.html以禁用哈希侦听:

  6. iOS 5上的jQuery事件

    解决方法在Apple开发论坛上由一个人回答:我需要在将元素添加到DOM之后才绑定(),如下所示:

  7. ios – 如何修复pods许可证文件错误

    当我输入要么我为一个库获得以下内容:无法读取许可证文件/Users/me/Documents/project/myproject/company/myproduct/Pods/OHAttributedLabel/OHAttributedLabel/LICENSEforthespecOHAttributedLabel(3.5.3)有谁知道为什么?我被建议:无济于事解决方法TL;DRIt’sRuby2

  8. ios – Swift Eureka Form中的循环

    我正在构建一个Eureka表单,并希望在表单中放置一个循环来构建基于数组的步进器列表.我试图使用的代码是:但是,当我这样做时,我在StepperRow行上出现了一个错误:所以看起来Swift不再认为它在形式之内并且正在关注

  9. 应用程序关闭时的iOS任务

    我正在构建一个应用程序,通过ajax将文件上传到服务器.问题是用户很可能有时不会有互联网连接,并且客户希望在用户重新连接时安排ajax调用.这可能是用户在离线时安排文件上传并关闭应用程序.应用程序关闭时可以进行ajax调用吗?

  10. swift 上传图片和参数 upload image with params

    Alamofire.upload(urlRequest.0,urlRequest.1).progress{(bytesWritten,totalBytesWritten,totalBytesExpectedToWrite)inprintln("\(totalBytesWritten)/\(totalBytesExpectedToWrite)")}}

随机推荐

  1. jquery-plugins – 是否可以使用猫头鹰旋转木马实现循环/无限轮播?

    我正在使用猫头鹰旋转木马,它的工作完美,除了它不支持循环/无限滚动.我没有搜索google和stackoverflow的想法,没有运气.有没有人在猫头鹰旋转木马上实现圆形/无限滚动?

  2. jQuery动态输入字段焦点

    我想使用以下jQuery向我的页面动态添加一个输入字段:在这样做之后,我希望输入字段具有闪烁的文本光标的焦点,所以我想在创建后立即输入.有人可以告诉我我该怎么办?

  3. jquery – 为什么$(window).height()这样错了?

    我试图获取当前浏览器的视口高度,使用但我得到的价值观太低了.当视口高度高达850px时,我从height()获取大约350或400像素的值.这是怎么回事?

  4. jquery – 如果在此div之外和其他draggables内部(使用无效和有效的还原选项),则可拖动恢复

    例如这样但是由于明显的原因,这不行.我可以说这个吗?

  5. 创建一个jQueryUI 1.8按钮菜单

    现在jQueryUI1.8已经出来了,我正在浏览更新,并且遇到了新的Buttonwidget,特别是SplitButtonwithadropdown的演示之一.这个演示似乎表明Buttonwidget可以在这里创建一个下拉菜单.作为讨论的问题,我想知道使用这个新的Button小部件来创建一个下拉菜单有什么方法.干杯.解决方法您必须在按钮下方列出一个列表,方式类似于此处为自动完成提供的演示:http

  6. 灰色divs使用JQuery

    我试图使用这个代码:为了淡出一大堆名为MySelectorDiv的div,唯一的是,它只会淡出第一个而不是所有的div,为什么呢?

  7. 使用jQuery动态插入到列表中

    我有两个订单列表在彼此旁边.当我从一个列表中选出一个节点时,我想按照字母顺序插入到另一个列表中.抓住的是我想要把一个元素放在另一个列表中,而不刷新整个列表.奇怪的是,当我插入到右边的列表中,它工作正常,但是当我插入到左边的列表中时,顺序永远不会出来.我也尝试将所有内容读入数组,并将其排序在一起,以防止children()方法没有按照显示顺序返回任何东西,但是我仍然得到相同的结果.这是我的jQuer

  8. 没有回应MediaWiki API使用jQuery

    我试图从维基百科获取一些内容作为JSON:但我没有回应.如果我粘贴到浏览器的地址栏,就像我得到预期的内容.怎么了?解决方法您需要通过添加&callback=?来触发具有$.getJSON()的JSONP行为?在querystring上,像这样:Youcantestithere.没有使用JSONP,你正在击中same-originpolicy,阻止XmlHttpRequest获取任何数据.

  9. jQuery Ajax请求每30秒

    我有这段代码,但是有些人在我的网站上的值可能会改变.我需要每30秒钟更新一次#financediv.这可以做吗解决方法您可以将代码放在单独的函数中,如下所示:然后每30秒建立一个定时器调用该函数:祝你好运!总结以上是DEVMAX为你收集整理的jQueryAjax请求每30秒全部内容。如果觉得DEVMAX网站内容还不错,欢迎将DEVMAX网站推荐给好友。

  10. jquery – keypress事件在IE和Chrome中不工作,但在FF工作

    任何想法为什么会这样发生?我通常认为Chrome会更加宽容代码?这是我的按键键.我错过了什么吗?右图();和leftimage();是应该工作的功能,因为我在其他地方使用这些功能谢谢您的帮助!

返回
顶部