Разбор параметров Rails, экранирование необходимо? - PullRequest
2 голосов
/ 27 июля 2010

В настоящее время я использую Jquery для сериализации () формы, содержащей текстовую область, и отправки ее в Rails.

В большинстве случаев это работает успешно, если только текстовая область не содержит строки в кавычках. Если такая строка существует, Rails анализирует содержимое между кавычками этой строки как переменную params, а не все содержимое поля.

Например: возьмите задачу [описание] следующего POST-запроса, отправленного на рельсы 2.3.8 через Jquery Post

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 Source

       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 * ​​1029 * в качестве содержимого переменной, а не всего после =

Кавычки экранируются как% 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 Ответ

1 голос
/ 28 июля 2010

Я следовал инструкциям в Ryan Bates Railscast 136 и создал минимальное приложение, используя подмножество вашей модели.

Это все работает нормально для меня.Rails 2.3.5 Ruby 1.8.7 OS / X

FIREBUG: Post

Параметры

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, но я не вижу, чтобы это изменило ситуацию)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...