1

我有一个表单,它传递与它之前的表单相同的参数:

<%= 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"}

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

4

3 回答 3

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)

最后在使用之前对你的参数哈希进行编码。在我的代码中,这看起来像:

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

于 2012-07-09T09:35:38.153 回答
1

将隐藏字段标记更改为:

<%= hidden_field_tag "workout[equipment_ids][]", params[:workout][:equipment_ids] %>
于 2012-07-09T00:30:57.983 回答
0

正如 Hallucynogenyc 所指出的,这是由.post_form( docs ) 方法只需要一个非嵌套的哈希值(即字符串)引起的。我有同样的问题,并通过切换使用该.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 方法来创建参数。如果您只使用直接的 html,由于某种原因,该.post_form方法更喜欢它。

Email <input name="student_email" type="email" autofocus="true">
于 2014-09-22T12:54:10.577 回答