在Rails 4表单中将列表作为参数数组提交,使用javascript将params值添加到params hash
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在Rails 4表单中将列表作为参数数组提交,使用javascript将params值添加到params hash,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含6630字,纯文字阅读大概需要10分钟。
内容图文
![在Rails 4表单中将列表作为参数数组提交,使用javascript将params值添加到params hash](/upload/InfoBanner/zyjiaocheng/699/b1392d1b59a74117aa6407ee9c78e4cc.jpg)
我有一个Rails 4表单,它在表单页面上使用AJAX构建部件列表.一旦在< ul>中构建了部件列表.我想在params散列中的参数中将列表作为值数组提交.
我的表格:
<%= form_for ([@tool, @service]),:html => { :onSubmit => 'getParts' } do |f| %>
<% if @service.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@service.errors.count, "error") %> prohibited this service from being saved:</h2>
<ul>
<% @service.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="row">
<div class="span4 offset1">
<div class="form-inline">
<%= f.hidden_field :tool_id , :value=>params[:tool_id] %>
<%= f.label :name %><br>
<%= f.text_field :name %>
</div>
<br>
<br>
<div class="form-inline">
<%= f.label :due_date %><br>
<%= f.text_field :due_date, 'data-behaviour' => 'datepicker' %>
</div>
<br>
<br>
<div class="form-inline">
<%= f.label :completed %><br>
<%= f.text_field :completed, 'data-behaviour' => 'datepicker' %>
</div>
<br>
<div class="field">
<%= f.label 'Service Type:' %>
<%= f.select :service_type_id, ServiceType.all.collect{|s| [s.name, s.id] }, {include_blank: false} %>
</div>
<br>
</div>
<div class="span7">
<div class="form-inline">
<div class="part_list_element">
Parts Used <br>
<%= text_field_tag :parts_used %>
</div>
</div>
<br>
Default Parts:
<ul id="serv_parts_list">
</ul>
<br>
<br>
<div class="form-inline">
<%= f.label :note %><br>
<%= f.text_area :note %>
</div>
<br>
<br>
<div class="actions">
<%= f.submit %>
</div>
</div>
</div>
<% end %>
当用户从选择列表中选择默认服务时,此javascript将触发:
$('#service_service_type_id').change(function() {
var id = this.value;
$.ajax
({
url:'/get_default_parts',
type:"POST",
data: {
service_type: {
id: id
}
}
});
});
这将根据选择从DB获取部件列表.然后它通过JS返回一个数组,然后将其附加到空的默认部件列表:
Default Parts:
<ul id="serv_parts_list">
</ul>
变为:
<ul id="serv_parts_list">
<li id="042511060272">042511060272 - Stihl/Denso Spark Plug W22mp-u<a class="service_parts"><-Remove</a></li>
<li id="795711145835">795711145835 - Bar Oil - Stihl<a class="service_parts"><-Remove</a></li>
<li id="795711478179">795711478179 - Stihl MS660/066 Air Filter<a class="service_parts"><-Remove</a></li>
</ul>
在我的application.js中,我有:
$(document).ready(function(){
$("#commit").click(function() {
$("#expended_parts").val(('#serv_parts_list').text());
});
});
但这没有做任何事情.我一直试图找出如何获得< li> < ul>中的元素进入一个数组并作为参数传递.但是目前的params hash看起来像:
Parameters: {"utf8"=>"?", "authenticity_token"=>"s/....=", "service"=>
{"tool_id"=>"113", "name"=>"test without hash", "due_date"=>"", "completed"=>"",
"service_type_id"=>"2", "note"=>""}, "parts_used"=>"", "commit"=>"Create Service"}
由于部件列表可以在页面加载后多次更新,无论是从AJAX调用获取附加到< li>的默认部件列表,我认为这必须绑定到提交事件.任何帮助表示赞赏.
解决方法:
我正在思考这一点,并找到了一个更容易的答案.自从我为此工作已经很长时间了,所以我不得不重新开始工作以重温我的记忆.
基本上我有构建的Javascript插入默认部分和任何添加的部分只是一个复选框列表已经检查了他们的框.这样,如果用户决定他们不需要其中一个默认部件,或者想要删除部件,他们可以取消选中该框,并且不会随表单一起提交.空复选框列表以上面显示的形式开头,如下所示:
Default Parts:<br>
<div id="default_parts_list" class="checkbox inline">
</div>
<br>
Other Parts:<br>
<div id="parts_expended" class="checkbox inline">
</div>
<br>
<br>
当在表单上更改服务类型的下拉列表时,它会触发上面问题中显示的javascript.这将获得零件清单并将其交给这个JS:
$("#default_parts_list").empty();
$("#default_parts_list").append('<%= escape_javascript(render :partial => 'get_default_parts' ) %>');
因此,_get_default_parts部分呈现:
<%= collection_check_boxes(:service, :part_ids, @parts_list, :id, :sku_name, {}, {checked: true}) do |b| %>
<%= b.label { b.check_box + b.object.name + " " + b.object.sku} %>
<% end %>
这会创建一个附加到表单的html,如下所示:
<div id="default_parts_list" class="checkbox inline">
<label for="service_part_ids_14">
<input checked="checked" id="service_part_ids_14" name="service[part_ids][]" type="checkbox" value="14">Stihl/Denso Spark Plug W22mp-u 042511060272
</label>
<label for="service_part_ids_24">
<input checked="checked" id="service_part_ids_24" name="service[part_ids][]" type="checkbox" value="24">Bar Oil - Stihl 795711145835
</label>
<label for="service_part_ids_10">
<input checked="checked" id="service_part_ids_10" name="service[part_ids][]" type="checkbox" value="10">Stihl MS660/066 Air Filter 795711478179
</label>
<input name="service[part_ids][]" type="hidden" value="">
</div>
因此,它们只是简单的旧复选框,最终与表单一起提交,最终以params哈希结尾:
Parameters: {"utf8"=>"?", "authenticity_token"=>"IHXcV0H8NnySxGIBXi8ZA=",
"service"=>{"tool_id"=>"121", "name"=>"refresher", "due_date"=>"2014-12-27",
"completed"=>"2014-12-27", "service_type_id"=>"2",
"part_ids"=>["14", "24", "10", ""], "note"=>""}, "parts_used"=>"",
"commit"=>"Create Service", "tool_id"=>"121"}
当使用相同的表单编辑和退出服务时,它必须使用不同的表单而不是上面的部分表单.编辑表单如下所示:
<h1>Editing service for <%=" #{@tool.category.name.singularize} / #{@tool.serial}" %></h1>
<%= form_for ([@tool, @service]) do |f| %>
<% if @service.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@service.errors.count, "error") %> prohibited this service from being saved:</h2>
<ul>
<% @service.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="row">
<div class="span4 offset1">
<div class="form-inline">
<%= f.hidden_field :tool_id , :value=>params[:tool_id] %>
<%= f.label :name %><br>
<%= f.text_field :name %>
</div>
<br>
<br>
<div class="form-inline">
<%= f.label :due_date %><br>
<%= f.text_field :due_date, 'data-behaviour' => 'datepicker' %>
</div>
<br>
<br>
<div class="form-inline">
<%= f.label :completed %><br>
<%= f.text_field :completed, 'data-behaviour' => 'datepicker' %>
</div>
<br>
<div class="field">
<%= f.label 'Service Type:' %>
<%= f.select :service_type_id, ServiceType.all.collect{|s| [s.name, s.id] }, {include_blank: false} %>
</div>
<br>
</div>
<div class="span7">
<div class="form-inline">
<div class="part_list_element">
Parts Used <br>
<%= text_field_tag :parts_used %>
</div>
</div>
<br>
<strong class="alert-danger">Any parts that get unchecked here will be returned to inventory</strong><br>
<b>Parts Used:</b> <br>
<div id="parts_used_list" class="checkbox inline">
<%= f.collection_check_boxes :part_ids, @service.parts, :id, :name %>
</div>
<br>
<b>Other Parts:</b> <br>
<div id="parts_expended" class="checkbox inline">
</div>
<br>
<br>
<div class="form-inline">
<%= f.label :note %><br>
<%= f.text_area :note %>
</div>
<br>
<br>
<div class="actions">
<%= f.submit %>
</div>
</div>
</div>
<% end %>
我希望这有助于任何人做类似的事情.您可以在github上查看完整的源应用程序:
EquipDB on github.com
内容总结
以上是互联网集市为您收集整理的在Rails 4表单中将列表作为参数数组提交,使用javascript将params值添加到params hash全部内容,希望文章能够帮你解决在Rails 4表单中将列表作为参数数组提交,使用javascript将params值添加到params hash所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。