如何用jquery加载rails表单部分并作为一个表单提交
How to load rails form partials with jquery and submit as one form
为了使我的rails html更具可读性,我将它的几个部分提取为部分。然后我使用jquery渲染部分。现在的问题是,可以说,表单已经完全"解钩"了,这意味着当我试图提交表单时,它的行为就好像部分不存在一样。我怀疑我不太理解表单是如何工作的,因为似乎在与此相关的其他答案中,表单构建器甚至没有解决。
这个问题似乎与我想做的事情有关,但我认为我太没有经验了,不能正确地把握它
到目前为止,我的代码如下:/assets/javascripts/work_order.js
$(document).ready(function(){
$('.best_in_place').best_in_place();
$('#work_order_dueDate').datepicker();
$.datepicker.setDefaults({ dateFormat: 'dd-mm-yy'});
var selection_made = false
$('#work_order_project_type_id').change(function(){
if (!selection_made){
selection_made = true
var selection = $(this).find('option:selected').text();
if (selection == "Variable Data Mailing"){
$.get('/presort_informations/new');
$.get('/printing_instructions/new');
}
else if (selection == "Mailing"){
$.get('/presort_informations/new');
}
else if (selection == "Print Job"){
$.get('/printing_instructions/new');
}
}
});
});
和
/views/work_orders/_form.html.erb
<%= form_for(@workorder) do |f| %>
<% if @workorder.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@workorder.errors.count, "error") %> prohibited this workorder from being saved:</h2>
<ul>
<% @workorder.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<fieldset class="general-info">
<legend>General</legend>
<div class="col-md-12">
<div class="col-md-3">
<div class="form-group">
<%= f.label :Job_Title, class: "control-label" %>
<%= f.text_field :title, class:"form-control" %>
</div>
<div class="form-group">
<%= f.label :Project_Type, class: "control-label" %>
<%= f.collection_select(:project_type_id, ProjectType.all, :id, :name, {:prompt => true}, {:class => "form-control"}) %>
</div>
</div>
<div class="col-md-3">
<div class="form-group">
<%= f.label :Rep, class: "control-label" %>
<%= f.text_field :rep, class:"form-control" %>
</div>
<div class="form-group">
<%= f.label :Labels, class: "control-label" %>
<%= f.collection_select(:labels_id, Labels.all, :id, :name, {:prompt => true}, {:class => "form-control"}) %>
</div>
</div>
<div class="col-md-3">
<div class= "form-group">
<%= f.label :Due_Date, class: "control-label" %>
<%= f.text_field :dueDate, class: "form-control" %>
</div>
<div class="form-group">
<%= f.label :Project_Description, class: "control-label" %>
<%= f.text_area :projectDescription, class: "form-control" %>
</div>
</div>
</div>
</fieldset>
<fieldset class="presort-information">
</fieldset>
<div class="col-md-6 printing">
</div>
<fieldset class="production-details">
<legend>Production</legend>
<%= f.fields_for :production_details, ProductionDetails.new do |ff| %>
<%end%>
</fieldset>
<%= f.hidden_field(:number, :value => @workorder.number) %>
<%= f.hidden_field(:client_id, :value => @workorder.client_id) %>
<%= f.submit(class: "btn btn-default") %>
<% end %>
和一个偏音的例子:
/app/views/presort_informations/new.js.erb
$('.presort-information').append( '<%= j render("presort_informations/form") %>' );
/app/views/presort_informations/_form.html.erb
<legend>Mailing</legend>
<%= fields_for :presort_information, PresortInformation.new do |ff| %>
.
.
.
<% end %>
我不太确定如何将这一切联系在一起,以便我可以根据选择框加载部分,但然后将它们作为一个表单提交。
编辑:我发现这个SO问题处理相同的问题,但我怀疑,因为我渲染部分后,页面已加载,我不再能够访问表单生成器变量。
$('.presort-information').append( '<%= j render("presort_informations/form", f: f) %>' );
在调用时给出一个未定义变量错误。我仍然不确定如何弥合jquery和rails之间的差距。
事实证明,这是一个相对容易的修复(如果概念对我来说是新的)首先,加载每个DOM部分和隐藏部分。
<%= form_for(@workorder) do |f| %>
<% if @workorder.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@workorder.errors.count, "error") %> prohibited this workorder from being saved:</h2>
<ul>
<% @workorder.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<fieldset id="general-info-partial">
<%=render("genInfo", f: f)%>
</fieldset>
<fieldset id="presort-information-partial">
<%=render("presort_informations/form", f: f)%>
</fieldset>
<div class="col-md-6">
<fieldset id="printing-information-partial">
<%=render("printing_instructions/form", f: f)%>
</fieldset>
</div>
<fieldset id="production-details-partial">
<%=render("production_details/form", f: f) %>
</fieldset>
<%= f.hidden_field(:number, :value => @workorder.number) %>
<%= f.hidden_field(:client_id, :value => @workorder.client_id) %>
<input type="submit" value="Submit" class="btn btn-default">
<% end %>
<div id="hidden-general-info" class="hidden"></div>
<div id="hidden-presort-information" class="hidden"></div>
<div id="hidden-printing-information" class="hidden"></div>
然后是Javascript把东西移进移出:
$(document).ready(function(){
$('.best_in_place').best_in_place();
$('#work_order_dueDate').datepicker();
$.datepicker.setDefaults({ dateFormat: 'dd-mm-yy'});
var presortFields = $('#presort-information-partial');
var printingFields = $('#printing-information-partial');
var presortHidden = $('#hidden-presort-information');
var printingHidden = $('#hidden-printing-information');
presortHidden.html(presortFields.html());
presortFields.html('');
printingHidden.html(printingFields.html());
printingFields.html('');
$('#work_order_project_type_id').change(function(){
var selection = $(this).find('option:selected').text();
if (selection == "Variable Data Mailing"){
if (printingFields.html() == '' && presortFields.html() == ''){
printingFields.html(printingHidden.html()).hide().slideDown();
presortFields.html(presortHidden.html()).hide().slideDown();
}
else if(printingFields.html() == '' && !(presortFields.html() == '')){
printingFields.html(printingHidden.html()).hide().slideDown();
}
else if(!(printingFields.html() == '') && presortFields.html() == ''){
presortFields.html(presortHidden.html()).hide().slideDown();
}
}
else if (selection == "Mailing"){
if(!(printingFields.html() == '')){
printingFields.slideUp();
printingFields.html('');
presortFields.html(presortHidden.html()).hide().slideDown();
}else{
presortFields.html(presortHidden.html()).hide().slideDown();
}
}
else if (selection == "Print Job"){
printingFields.html(printingHidden.html()).hide().slideDown();
presortFields.slideUp();
presortFields.html('');
}
});
基本上,我们的想法是加载所有东西,就好像我要使用它一样,然后只是将部分移动到DOM的隐藏部分,然后在用户做出选择时使用JS将它们放回
相关文章:
- 在另一个可观察量完成后触发第二个表单提交单击
- 使用jquery进度条重定向到表单提交后的另一个页面
- 阻止表单提交 javascript 为什么有一个明显的错误语句返回 true
- javascript表单提交一个值应该大于另一个值x>y
- 提交一个javascript变量的值和一个表单提交
- 一次提交两个 HTML 表单,一个在当前窗口中,一个在新窗口中
- 如何防止页面在表单提交时重新加载,并显示一个小文本说“已成功注册”
- 通过一个表单提交的单个动态值
- 如何将一个 html 表单提交到差异操作
- Safari 5中一个奇怪的javascript表单提交错误的解决方法是什么
- 如何在一个表单提交上执行 2 个 AJAX 请求
- 在表单提交后,无法使用 mvc razor 中的 ajax 从其中的另一个分部视图刷新分部视图
- JavaScript 表单提交带有一个名为 submit 的字段
- 在上一个表单提交中显示更改的表单
- 表单提交将取消URL查询字符串中的一个参数
- 在提交jsf按钮时向表单传递一个javascript值
- 我希望在表单提交后有一个提醒框,而不是重定向到thank-you.html
- 一次提交多个表单将中止除最后一个表单外的所有表单提交
- 将表单提交到另一个页面(与ACTION中使用的页面不同)
- 我如何才能得到一个表单提交只有一次隐藏的值已经从谷歌地理编码服务更新