这曾经对我有用,但是我已经改变了一些东西,现在它不起作用,对于我的生活,我无法弄清楚我改变了什么。
基本上,我有一个页面,我正在实现jquery拖放功能,当单击提交按钮时,我会传递一些数据来存储所有已拖放的元素的x和y位置。
您可以在下面的jquery代码段中看到我正在使用$.post
。然后在我的控制器中,我将数据保存到数据库中。
问题是params[:application]
总是为零。它曾经包含应用程序数据,但是我已经更改了一些内容,这不再有效。
为什么我的 ajax 调用不包含参数 [:application]?
这是我正在点击的网址 - /applications/1/edit
这是我的jquery提交函数
$('.organizer').submit(function(e) {
e.preventDefault();
e.stopPropagation();
var dataToSubmit = $(this).serialize();
var ids = [];
var field_values = [];
var x_values = [];
var y_values = [];
var success = true;
console.log('dataToSubmit = '+dataToSubmit);
$('.organizer .draggable').each(function() {
// add the draggable value to an array
field_values.push($(this).find('a').text().trim());
ids.push($(this).find('a').data('id'));
x_values.push($(this).closest('td').data('counter'));
y_values.push($(this).closest('tr').data('counter'));
});
for(i = 0; i < field_values.length; ++i) {
console.log('id = '+ids[i]);
dataToSubmit += "&field_name="+field_values[i]+"&appfieldid="+ids[i]+"&xposition="+x_values[i]+"&yposition="+y_values[i];
console.log(decodeURIComponent(dataToSubmit));
$.post($(this).attr('action'), dataToSubmit).error(function() {
success = false;
});
}
// if all of the ajax calls were successful, show a success message
if(success) {
$('h1').after('<div class="nNote nSuccess"><p>Application Updated Successfully!</p></div>');
$('.nSuccess').delay(5000).fadeOut();
}
});
这是我的控制器方法
# PUT /applications/1
# PUT /applications/1.json
def update
@application = Application.find(params[:id])
p params[:appfieldid]
p params[:xposition]
p params[:yposition]
p params[:field_name]
p params[:application] # WHY IS THIS ALWAYS NIL?
app_fields = params[:application]
p app_fields
app_fields['application_field_attributes']["0"].merge!({"id"=>params[:appfieldid], "xposition"=>params[:xposition], "yposition"=>params[:yposition]}) #app_fields['application_field_attributes']['yposition'] = params[:yposition]
p app_fields
respond_to do |format|
if @application.update_attributes(app_fields)
#@application.application_details.xposition = params[:xposition]
#@application.application_details.yposition = params[:yposition]
@curr_app = ApplicationField.last
format.html { render :nothing => true }
format.json { head :no_content }
format.js # WHY IS THIS NOT CALLED? INSTEAD I'M USING A SUCCESS CALLBACK ON THE $.POST METHOD
else
format.html { render action: "edit" }
format.json { render json: @application.errors, status: :unprocessable_entity }
format.js { render action: "update" }
end
end
end
这是生成的表单标记
<form accept-charset="UTF-8" action="/applications/3" class="organizer" data-remote="true" id="edit_application_3" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /><input name="_method" type="hidden" value="put" /><input name="authenticity_token" type="hidden" value="3LOzuiL/PU6HypJ4OeN5H9yrX3Xyk0VT6XpcFYd1wY0=" /></div>
<fieldset>
<div class="widget fluid">
<div class="whead"><h6>New Application</h6><div class="clear"></div></div>
<table cellpadding="0" cellspacing="0" width="100%" class="tDefault tMedia" id="app_table">
<thead>
<tr>
<td width="35%">First Half</td>
<td width="35%">Second Half</td>
</tr>
</thead>
<tfoot>
<tr>
<td colspan="6">
<input class="buttonS bBlue" name="commit" type="submit" value="Submit" />
</td>
</tr>
</tfoot>
<tbody>
<tr data-counter="0">
<td class="droppable nopadding" data-counter="0">
</td>
<td class="droppable nopadding" data-counter="1">
</td>
</tr>
<tr data-counter="1">
<td class="droppable nopadding" data-counter="0">
</td>
<td class="droppable nopadding" data-counter="1">
</td>
</tr>
</tbody>
</table>
</div>
</fieldset>
</form>
编辑
以下是一些更多信息:
# GET /applications/1/edit
def edit
@application = Application.find(params[:id])
end
编辑.html.erb
<%= form_for(@application, :html => {:class => "organizer"}, :remote => true) do |f| %>
...
<% @application.application_field.each_with_index do |f, i| %>
<tr data-counter="<%= i %>">
<td class="droppable nopadding" data-counter="0">
<% @application.application_field.each_with_index do |f2, i2| %>
<% if f2.yposition == i && f2.xposition == 0 %>
<ul class="subNav noborder">
<li class="draggable" style="height: 64px;">
<a value="#" data-id="<%= f.id %>" style="height: 47px;">
<span class="icos-list2 move"></span>
<span class="field_label"><%= f2.field_name %></span>
<% if f.field_type == 'textfield' %>
<input type="text" class="textfield" name="textfield" />
<% elsif f.field_type == 'dropdown' %>
<!-- TODO - fill in for dropdown -->
<% elsif f.field_type == 'checkbox' %>
<!-- TODO - fill in for checkbox -->
<% end %>
</a>
<%= link_to '<span class=icos-cross></span>'.html_safe, application_field_path(f), :class => 'remove_fields close', :method => :delete, :remote => true %>
</li>
</ul>
<% end %>
<% end %>
</td>
<td class="droppable nopadding" data-counter="1">
<% @application.application_field.each_with_index do |f2, i2| %>
<% if f2.yposition == i && f2.xposition == 1 %>
<ul class="subNav noborder">
<li class="draggable" style="height: 64px;">
<a value="#" data-id="<%= f.id %>" style="height: 47px;">
<span class="icos-list2 move"></span>
<span class="field_label"><%= f2.field_name %></span>
<% if f.field_type == 'textfield' %>
<input type="text" class="textfield" name="textfield" />
<% elsif f.field_type == 'dropdown' %>
<!-- TODO - fill in for dropdown -->
<% elsif f.field_type == 'checkbox' %>
<!-- TODO - fill in for checkbox -->
<% end %>
</a>
<%= link_to '<span class=icos-cross></span>'.html_safe, application_field_path(f), :class => 'remove_fields close', :method => :delete, :remote => true %>
</li>
</ul>
<% end %>
<% end %>
</td>
</tr>
<% end %>
<% end %>
dataToSubmit 是否包含应用程序参数?它应该是什么?一个身份证?什么?
$(this).serialize() 的值是多少?
dataToSubmit += "&field_name="+field_values[i]+"&appfieldid="+ids[i]+"&xposition="+x_values[i]+"&yposition="+y_values[i];
我猜您在带有名称应用程序的表单上缺少输入字段,我在表单代码上看不到它。
此外,您的请求不会呈现 js 响应,因为您没有使用格式"script"调用它。执行以下操作:
$.post($(this).attr('action'), dataToSubmit).error(
function() {
success = false;
},'script');
应该使用 JS 格式发出请求
检查服务器日志,它会告诉您请求中的所有参数和格式,您无需将所有内容都放在控制器上,这很混乱
通过尝试一堆我记得以前做过的事情,我发现
<%= f.fields_for :application_field do |field| %>
...
<% end %>
params[:application]
被传递给控制器。
我不确定为什么这会让它工作,因为我实际上并没有对field
做任何事情。