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' %>

最初の形式は正常に機能し、「別の形式を取得」する2番目の形式では、次のcan't convert Symbol into Integer行のエラーが発生します。

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

渡される最初と2番目の形式のパラメーターは次のとおりです。

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

非表示フィールドタグを次のように変更しました。

<%= hidden_field_tag "workout[equipment_ids][]", params[:workout][:equipment_ids] %>
于 2012-07-09T00:30:57.983 に答える
1

カスタムPOSTリクエストを使用してフォームを手動で送信しようとしたときに、同じ問題が発生しました。問題は、net / http post_formメソッドが、すべての値が文字列である単一のハッシュしか処理できないことであるように思われます。ハッシュ内にハッシュがある場合(scaffoldが生成する形式のように)、内部ハッシュを文字列として扱い、先ほど見たように大混乱を引き起こす厄介なバックスラッシュを追加します:)

私にとっての解決策は、低レベルの「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

于 2012-07-09T09:35:38.153 に答える
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メソッドは、ハッシュの変換にも役立ちます。

これを解決する別の方法は、railsformメソッドを使用してパラメーターを作成しないことです。ストレートHTMLを使用する場合は、何らかの理由で.post_formメソッドの方が適しています。

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