从下拉菜单选择动态添加表单
Adding Forms Dynamically From Dropdown Menu Selection
我有一个关于通过下拉选择添加动态表单的Ruby on Rails问题,而不是为每个可能的选择设置单独的按钮。
现在,通过一些railscast的帮助,我的应用程序工作在我有三个单独的按钮,能够动态地将三种不同类型的嵌套表单添加到父控件中,它们都对应于具有不同表单部分的不同模型。
这里的父模型是一个Workout,允许使用JS动态地添加traditional_blocks、emon_blocks和tempo_blocks。
运动模型
class Workout < ActiveRecord::Base
has_many :tempos
has_many :traditionals
has_many :emons
accepts_nested_attributes_for :tempos, allow_destroy: true
accepts_nested_attributes_for :emons, allow_destroy: true
accepts_nested_attributes_for :traditionals, allow_destroy: true
end
/app/views/训练/new.html.erb
<div>
<%= button_to_add_fields "Add EMON Block", f, :emons %>
<%= button_to_add_fields "Add traditional Block", f, :traditionals %>
<%= button_to_add_fields "Add tempo Block", f, :tempos %>
</div>
引入application_helper . rb之后/应用程序/帮助/module ApplicationHelper
def button_to_add_fields(name, f, association)
new_object = f.object.send(association).klass.new
id = new_object.object_id
fields = f.fields_for(association, new_object, child_index: id) do |builder|
render(association.to_s.singularize + "_fields", f: builder)
end
button_to(name, '#', class: "add_fields", data: {id: id, fields: fields.gsub("'n", "")})
end
end
应用程序/资产/javascript/workouts.js.coffee
$(document).on 'click', 'form .add_fields', (event) ->
time = new Date().getTime()
regexp = new RegExp($(this).data('id'), 'g')
$(this).before($(this).data('fields').replace(regexp, time))
event.preventDefault()
就像我之前说的,当我点击按钮时,一切都按照我想要的方式工作。然而,我希望能够把"emon块,传统块,节奏块"内的collection_select一个按钮旁边的collection_select说"创建"。当"创建"按钮被单击时,我希望它调用相同的帮助器(button_to_add_fields),传递必要的参数,使其工作方式与现在的多按钮实现相同,但使用当前选择的集合选择中的关联。
提示吗?
您将希望使用Ajax
作为此
您所查看的Railscast虽然很有帮助,但在某种程度上是有限的,它只允许您每次添加单个嵌套表单
,
#config/routes.rb
resources :workouts do
get "ajax_fields/:type", on: :collection
end
#app/models/workout.rb
Class Workout < ActiveRecord::Base
...
def self.build type
workout = self.new
if type
workout.send(type).build
else
workout.tempos.build
workout.traditionals.build
workout.emons.build
end
end
end
#app/controllers/workouts_controller.rb
Class WorkoutsController < ApplicationController
def ajax_update
@workout = Workout.build params[:type]
render "form", layout: !request.xhr?
end
end
#app/views/workouts/_form.html.erb
<%= form_for @workout do |f| %>
<%= render "fields", locals: { f: f }, onject: params[:type] %>
<%= f.submit %>
<% end %>
#app/views/workouts/_fields.html.erb
<%= f.fields_for type.to_sym, child_index: Time.now.to_i do |t| %>
<%= t.text_field :your_field %>
<% end %>
#app/views/workouts/new.html.erb
<%= form_for @workout do |f| %>
<%= render: "fields", locals: { f: f}, collection: ["tempos", "traditionals", "emons"], as: :type %>
<%= ... dropdown code ...%>
<%= f.submit %>
<% end %>
,
允许您发送以下ajax
请求:
#app/assets/javascripts/workouts.js.coffee
$(document).on 'change', 'form .add_fields', (event) ->
type = $(this).val
$.ajax
url: "/workouts/ajax_fields/" + type,
success: function(data) {
$("form").append(data); // will have to work this out properly
}
});
这将使您能够向应用程序添加所需的额外字段,然后应用程序将返回适当的HTML,以便您将其添加到DOM
中。希望你能理解这里的情绪-它可能无法立即开箱工作!
相关文章:
- 使用 JavaScript 计算并添加表单输入的值
- Ionic Framework如何为带有国家代码的手机号码添加表单
- 在springmvc中动态添加表单元素
- 选择动态添加表单的元素
- 通过 jquery 添加表单
- WordPress - 访问简码 HTML 并添加表单验证以停止空表单提交
- 允许用户添加表单输入字段:为什么 append() 只工作一次
- 使用 Angular 动态添加表单输入
- JQuery 添加表单元素迭代 ID
- 使用 jQquery 动态添加表单元素
- 如何在此弹出窗口中添加表单数据
- Thymeleaf+spring+Jquery动态添加表单
- jQuery 动态添加表单域,删除表单域
- 如何在多步jquery中添加表单步骤验证(使用单选按钮)
- 为virtualmart中所需的输入字段添加表单中的星号
- 如何使用javascript随机添加表单输入值
- 从下拉菜单选择动态添加表单
- Javascript:点击添加表单
- 动态添加表单输入字段
- 用javascript添加表单