我有一个表单,它传递与之前的表单相同的参数:
<%= 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"}
唯一的区别是逃避反斜杠。我不确定为什么这会导致问题?
答案 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
不知道是否有更好的解决方案,但这对我有用。
答案 2 :(得分: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方法创建params。如果您只使用直接html,由于某种原因,.post_form
方法更喜欢它。
Email <input name="student_email" type="email" autofocus="true">