Rails params解析,逃避需要吗?

时间:2010-07-27 00:46:14

标签: jquery ruby-on-rails ruby

我目前正在使用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")}
})

1 个答案:

答案 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,但我不认为这会有所作为)