我目前正在使用Jquery序列化()一个包含textarea的表单,并将其POST到Rails。
这在大多数情况下都能正常工作,除非textarea本身包含一行引号。如果存在这样的行,Rails会将该行的引号之间的内容解析为params变量而不是该字段的整个内容。
例如:获取以下POST请求的任务[description],通过Jquery Post发送到rails 2.3.8
FireBug:POST参数
authenticity_token r0uu4QQ9e73aEsSKl2LJRIWap1BSQWMKRaieCOwHEpg=
task[description] line1
"line2"
"line3"
line4
task[due_date]
task[project_id] 1
task[responsible_user_id] nobody
task[title] Parse Bug
Firebug:POST来源
authenticity_token=r0uu4QQ9e73aEsSKl2LJRIWap1BSQWMKRaieCOwHEpg%3D&
task%5Bproject_id%5D=1&task%5Bresponsible_user_id%5D=nobody&
task%5Bdue_date%5D=&task%5Btitle%5D=Parse+Bug&
task%5Bdescription%5D=line1%0A%22line2%22%0A%22line3%22%0Aline4
在rails解析请求后,params [:task] [:description]获取“line2”的值而不是整个文本块。 (line1“line2”“line3”line4)...见下文
Rails开发日志
Processing TasksController#create (for 127.0.0.1 at 2010-07-26 17:05:06) [POST]
Parameters: {"action"=>"create", "authenticity_token"=>"r0uu4QQ9e73aEsSKl2LJRIWap1BSQWMKRaieCOwHEpg=",
"task"=>{"title"=>"Parse Bug", "project_id"=>"1", "due_date"=>"",
"description"=>"line2", "responsible_user_id"=>"nobody"}, "controller"=>"tasks"}
Rails似乎从 POST源解析两个%0A%22 之间的任何内容作为变量的内容而不是 = 之后的所有内容强>
报价以%22的形式转义,但是我应该以不同方式转义它们吗?
非常感谢! 如果我的描述令人困惑,请让我澄清其中的任何部分。
更新
这是使用的相对Jquery:
$('#new-item').find('.submit').live('click', function(){
var form = $(this).closest('form');
$.post(form.attr("action"), form.serialize(), null, "script");
return false;
});
$.ajaxSetup({
'beforeSend':function(xhr) {xhr.setRequestHeader("Accept", "text/javascript")}
})
答案 0 :(得分:1)
我已按照Ryan Bates Railscast 136中的说明操作,并使用您模型的子集创建了一个最小应用程序。
这对我来说都很好。 Rails 2.3.5 Ruby 1.8.7 OS / X
FIREBUG:发布
<强>参数强>
authenticity_token 7JSQYKGEsteve8Emm5ZrdstOEgvvSJCD6Quxl588g5M=
task[description] line1 "line2" "line3" line4
task[responsible_user] steve
task[title] Test 2 quoted
<强>来源
authenticity_token=7JSQYKGEsteve8Emm5ZrdstOEgvvSJCD6Quxl588g5M%3D&task%5B
description%5D=line1%0A%22line2%22%0A%22line3%22%0Aline4&task%5B
responsible_user%5D=steve&task%5Btitle%5D=Test+2+quoted
Rails开发日志
Parameters: {
"authenticity_token"=>"7JSQYKGEhgfIY8Emm5ZrdstOEgvvSJCD6Quxl588g5M=",
"task"=>{"title"=>"Test 2 quoted",
"description"=>"line1\n\"line2\"\n\"line3\"\nline4",
"responsible_user"=>"steve"}
}
rails应用程序的相关代码如下: -
<强>的application.js 强>
// public/javascripts/application.js
jQuery.ajaxSetup({
'beforeSend': function(xhr) {xhr.setRequestHeader("Accept", "text/javascript")}
})
jQuery.fn.submitWithAjax = function() {
this.submit(function() {
$.post(this.action, $(this).serialize(), null, "script");
return false;
})
return this;
};
$(document).ready(function() {
$("#new_task").submitWithAjax();
})
应用/视图/任务/ create.js.erb 强>
// views/tasks/create.js.erb
$("#new_task").before('<div id="flash_notice">
<%=escape_javascript(flash.delete(:notice)) %></div>');
$("#tasks_count").html("<%= pluralize(Task.count, 'Task') %>");
$("#new_task")[0].reset();
应用/视图/任务/ create.js.erb 强>
<% form_for @task do |f| %>
<p id="tasks_count">
<%= pluralize(Task.count, 'Task') %>
</p>
<%= f.error_messages %>
<p>
<%= f.label :description %><br />
<%= f.text_area :description %>
</p>
<p>
<%= f.label :responsible_user %><br />
<%= f.text_field :responsible_user %>
</p>
<p>
<%= f.label :title %><br />
<%= f.text_field :title %>
</p>
<p><%= f.submit "Submit" %></p>
<% end %>
明显不同的是Firebug中的参数格式。我的所有都出现在一行,但编码的源看起来很好。 (我使用的是Firebug Lite,但我不认为这会有所作为)