【问题标题】:Rails - escaping backslashes in params causing havoc?Rails - 在参数中转义反斜杠会造成严重破坏?
【发布时间】:2014-09-22 20:54:10
【问题描述】:

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

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

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

【问题讨论】:

  • 这里的问题是因为您试图将字段作为字符串而不是哈希传递。您所看到的反斜杠没有问题,而是无法理解 params[:workout] 传递到字段然后通过表单提交不会神奇地变成哈希。您能否解释一下为什么要尝试这样做,而不是仅仅将锻炼保存在数据库中?
  • 是的,你是对的,我现在正在努力

标签: ruby-on-rails ruby-on-rails-3 params


【解决方案1】:

将隐藏字段标签改为:

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

【讨论】:

    【解决方案2】:

    我在尝试使用自定义 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

    【讨论】:

    • 可以改用to_query。不适用于Net::HTTP.post_form
    • 抱歉 n00b 问题,但是“Hash.send(:include, HashToHttpParams)”代码在 rails 应用程序中的什么位置?在哪些文件中?我有同样的问题...谢谢
    【解决方案3】:

    正如 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">
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-16
      • 1970-01-01
      • 2013-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多