2010-07-27 45 views
2

我目前使用jquery序列化()一個窗體,其中包含一個textarea,並將其張貼到Rails。Rails的params解析,逃避需要?

這在大多數情況下都可以成功運行,除非textarea自身包含一行引號。如果存在這樣的行,Rails會將該行的引號之間的內容解析爲params變量,而不是該字段的全部內容。

例如:採取以下POST請求的任務[說明],發送通過jQuery張貼到導軌2.3.8

螢火: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 

螢火蟲: 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」的值而不是整個文本塊。 (一號線 「2號線」, 「3號線」 4號線)...見下文

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通過源後任何解析之間有兩個%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

要添加一些更多的說明,只有在整行引用時纔會發生這種情況。如果該行的一部分用引號引起來,Rails會適當地解析它。 如果2行完全在引號中(如上例中的「line3」)。它將採用引號中的第一行作爲params散列值。 我看到好幾張選票和明星,其他人是否也遇到過這種情況? – csponge 2010-07-27 16:09:37

+0

如果其他人和我一樣,明星們會將其添加到收藏夾中,以便他們看到答案。 – 2010-07-27 20:22:16

+0

你可以編輯這個問題,並添加你用來做這個帖子的jQuery代碼。 – 2010-07-27 20:39:43

回答

1

我跟着Ryan Bates Railscast 136的指示,創建使用模型的子集的最小應用。

這對我來說都很好。 Rails 2.3.5 Ruby 1.8。7 OS/X

螢火蟲:郵政

參數

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(); 

應用程序/視圖S /任務/ 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 %> 

的明顯區別是內螢火蟲的PARAMATERS的格式。我的所有出現在一行,但編碼的來源看起來很好。 (我正在使用Firebug Lite,但我不會看到有所作爲)

+0

您好史蒂夫,感謝您的幫助。對我來說看起來很不尋常,你不能複製這個問題,我現在創建一個輕量級的虛擬應用程序來運行更多的測試。 – csponge 2010-07-27 23:19:18