Rails - 在params中逃避反斜杠造成破坏?

时间:2012-07-09 00:10:31

标签: ruby-on-rails ruby-on-rails-3 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}

传递的第一种和第二种形式的参数是:

 {"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"}

唯一的区别是逃避反斜杠。我不确定为什么这会导致问题?

3 个答案:

答案 0 :(得分:1)

将隐藏字段标记更改为:

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

答案 1 :(得分: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类中:

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

答案 2 :(得分: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 form方法创建params。如果您只使用直接html,由于某种原因,.post_form方法更喜欢它。

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