【问题标题】:Rails params parsing, escaping needed?Rails 参数解析,需要转义吗?
【发布时间】:2010-07-27 00:46:14
【问题描述】:

我目前正在使用 Jquery 来序列化()一个包含文本区域的表单,并将其发布到 Rails。

这在大多数情况下都可以成功,除非文本区域本身包含引号中的行。如果存在这样的行,Rails 会将该行的引号之间的内容解析为 params 变量,而不是字段的全部内容。

例如:获取以下 POST 请求的任务[描述],通过 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")}
})

【问题讨论】:

  • 为了更清楚地说明,这只有在整行都用引号引起来时才会发生。如果只有部分行在引号中,Rails 会适当地解析事物。如果 2 行完全用引号引起来(如上例中的“line3”)。它将引号中的第一行作为参数哈希值。我看到了几个投票和星星,其他人是否也遇到这种情况?
  • 如果其他人像我一样,明星就是人们将它添加到收藏夹以便他们可以看到答案。
  • 您能否编辑问题并添加您用于发布帖子的 jquery 代码。
  • 嗨,史蒂夫,我用使用的 jQuery 更新了我的原始帖子。它与您在下面发布的内容非常相似。

标签: jquery ruby-on-rails ruby


【解决方案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();
})

app/views/tasks/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();

app/views/tasks/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,但我认为这不会产生影响)

【讨论】:

  • 您好史蒂夫,感谢您的帮助。对我来说,您无法复制问题似乎很不寻常,我现在正在创建一个轻量级的虚拟应用程序来运行更多测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多