栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Rails使用f.fields_for和AJAX接受_nested_attributes_for

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Rails使用f.fields_for和AJAX接受_nested_attributes_for

有可能的

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

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

顺便说一句,我们手动执行此操作。茧实际上看起来非常好,并且似乎使用与我们相同的原理。还有一个RailsCast,但这仅适用于单个添加项(我认为)


f.fields_for

您的方法是使用一系列局部函数,这些局部函数可动态构建所需的字段。从您的代码看来,您已经具备了基础知识(表单正在运行),因此现在是构建几个组件来处理AJAX请求的情况:

  1. 您需要在控制器上处理AJAX(路由+控制器操作)
  2. 您需要将f.fields_for放入partials(以便可以用Ajax调用它们)
  3. 您需要处理
    build
    模型中的功能

使用控制器处理AJAX

首先,您需要在控制器中处理Ajax请求

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

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

控制器动作然后转换为:

#app/controllers/messages_controller.rb#Ajax Add Subscriberdef add_subscriber    @message = Message.build    render "add_subscriber", :layout => falseend

添加您的

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

如果要添加多个字段,将

[id]
面临的最大问题是增加字段的字段(这是我们在Ryan Bates的教程中发现的缺陷)

我发布的第一个教程解决此问题的方法是只使用设置

child_index
新字段
Time.now.to_i
。这将设置一个唯一的ID,并且由于新字段的实际ID无关紧要,因此您可以根据需要添加任意多个字段


jQuery查询

    #Add Subscriber    $ ->      $(document).on "click", "#add_subscriber", (e) ->         e.preventDefault();         #Ajax         $.ajaxurl: '/messages/add_subscriber'success: (data) ->    el_to_add = $(data).html()    $('#subscribers').append(el_to_add)error: (data) ->    alert "Sorry, There Was An Error!"


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/392191.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号