2012-07-09 28 views
1

我有以前它通過相同的參數表格形式:Rails - params中的反斜槓導致嚴重破壞?

<%= form_tag({:controller => "workouts", :action => "random"}) do %> 
<%= hidden_field_tag :workout, params[:workout] %> 
<%= hidden_field_tag :time, params[:time] %> 
<%= submit_tag "Get Another", :class => 'btn' %> 

第一種形式工作正常,第二種形式爲「得到另一個」給我的錯誤can't convert Symbol into Integer這一行:

@equipment_ids = params[:workout][:equipment_ids].collect{|s| s.to_i} 

被傳遞的第一和第二形式的PARAMS是:

{"utf8"=>"✓", 
"authenticity_token"=>"qj/Q/YWvLKK3A3paAnEom4oTFtq44daX6dvEb8qmgtE=", 
"workout"=>{"equipment_ids"=>["", 
"508", 
"518"]}, 
"time"=>"25", 
"commit"=>"Get Workout"} 


{"utf8"=>"✓", 
    "authenticity_token"=>"qj/Q/YWvLKK3A3paAnEom4oTFtq44daX6dvEb8qmgtE=", 
    "workout"=>"{\"equipment_ids\"=>[\"\", 
    \"508\", 
    \"518\"]}", 
    "time"=>"25", 
    "commit"=>"Get Another"} 

唯一的區別是逸出反斜槓。我不確定爲什麼這些會導致問題?

+0

這裏的問題是因爲您試圖將字段作爲字符串傳遞,而不是哈希。你看到的反斜槓沒有問題,但是沒有理解params [:workout]傳遞到一個字段然後通過表單提交的情況不會奇蹟般地變成哈希。你能解釋一下爲什麼你試圖這樣做,而不是僅僅堅持數據庫中的鍛鍊? – 2012-07-09 00:18:19

+0

是啊你說得對,我現在正在處理它 – Nick5a1 2012-07-09 00:26:46

回答

1

改變了隱藏字段標籤:

<%= hidden_field_tag "workout[equipment_ids][]", params[:workout][:equipment_ids] %> 
1

試圖手動提交表單使用自定義POST請求時,我剛走進了同樣的問題。問題似乎是net/http post_form方法只能處理一個散列,其中所有的值都是字符串。如果你在散列內部有散列(就像腳手架產生的形式一樣),它會把內部散列作爲一個字符串處理,並添加一些令人討厭的反斜槓,正如你剛剛看到的那樣造成了嚴重的後果:​​)

對我來說,使用較低級別的「post」方法,並手動編碼散列。定義這個模塊:

module HashToHttpParams 
    def to_http_params 
    map do |k, v| 
     if v.is_a?(Hash) 
     v.map do |kk, vv| 
      "#{k}[#{kk}]=#{vv}" 
     end.join('&') 
     else 
     "#{k}=#{v}" 
     end 
    end.join('&') 
    end 
end 

然後將其添加到哈希類代碼:

Hash.send(:include, HashToHttpParams) 

使用它之前最後編碼您的PARAMS哈希值。在我的代碼中,這看起來像:

Net::HTTP.start("localhost",3000) do |http| 
    http.post("/tests", params.to_http_params) 
end 

不知道是否有更好的解決方案,但這對我有效。

來源:http://porras.lacoctelera.net/post/2007/10/08/enviando-formularios-con-parametros-compuestos-con-ruby-y-net#c4300080

+0

真棒,只是一直坐在這個問題上長.. – 2013-04-15 15:50:38

+0

可能使用'to_query'來代替。不適用於Net :: HTTP。post_form' – 2013-04-15 16:33:36

+0

對不起n00b問題,但「Hash.send(:include,HashToHttpParams)」代碼在rails應用程序中出現在哪裏?在什麼文件中?我有同樣的問題......謝謝 – andrewcockerham 2014-09-17 12:48:17

0

正如Hallucynogenyc指出的,這是由.post_formdocs)方法只想要一個非嵌套散列即字符串引起的。我有這個相同的問題,並通過切換到使用.post方法來解決它。

require "net/http" 
uri = URI('http://www.yoururl.com') 
http = Net::HTTP.new(uri.host) 
response = http.post(uri.path, params.to_query) 

.to_query方法也可用於轉換散列。

解決它的另一種方法是不使用rails窗體方法來創建你的參數。如果你只是使用直線html,出於某種原因,.post_form方法更好。

Email <input name="student_email" type="email" autofocus="true">