如何从params散列中删除特殊字符?

时间:2013-05-06 16:26:57

标签: ruby-on-rails sanitize

我有一个带有以下代码的应用程序:

quantity = 3
unit_types = ['MarineTrac','MotoTrac','MarineTrac']
airtime_plan = 'Monthly Airtime Plan'

url = "http://localhost:3000/home/create_units_from_paypal?quantity=#{quantity}&unit_types=#{unit_types}&airtime_plan=#{airtime_plan}"

begin
  resp = Net::HTTP.get(URI.parse(URI.encode(url.strip)))
  resp = JSON.parse(resp)
  puts "resp is: #{resp}"
  true
rescue => error
  puts "Error: #{error}"
  return nil
end

它通过URL params查询字符串将数据发送到我的其他应用程序。这就是其他应用程序的控制器方法:

def create_units_from_paypal
  quantity = params[:quantity]
  unit_types = params[:unit_types]
  airtime_plan = params[:airtime_plan]

 quantity.times do |index|
   Unit.create! unit_type_id: UnitType.find_by_name(unit_types[index]),
              airtime_plan_id: AirtimePlan.find_by_name(airtime_plan),
              activation_state: ACTIVATION_STATES[:activated]
 end

  respond_to do |format|
    format.json { render :json => {:status => "success"}}
  end
end

我收到此错误:

<h1>
  NoMethodError
    in HomeController#create_units_from_paypal
</h1>
<pre>undefined method `times' for &quot;3&quot;:String</pre>


<p><code>Rails.root: /Users/johnmerlino/Documents/github/my_app</code></p>

我尝试在raw和其他html_safe上同时使用params[:quantity]params,但我仍然收到错误消息。注意我必须使用URI.encode(url),因为URI.parse(url)返回错误的uri可能是因为unit_types数组。

1 个答案:

答案 0 :(得分:1)

变化:

 quantity.times do |index|

要:

 quantity.to_i.times do |index|

您遇到此问题的原因是因为您将params值视为您最初尝试发送的类型,但它们实际上始终是字符串。转换回预期的“类型”可以解决您的问题。

但是,你有一些更基本的问题。首先,您尝试通过简单地将其格式化为字符串来发送数组。但是,这不是接收应用程序期望转换回数组的格式。其次,您的请求中存在重复 - 您无需指定数量。数组本身的长度是数量。一个更好的方法是建立你的网址:

url = 'http://localhost:3000/home/create_units_from_paypal?'
url << URI.escape("airtime_plan=#{airtime_plan}") << "&"
url << unit_types.map{|ut| URI.escape "unit_types[]=#{ut}" }.join('&')

在接收方,你可以这样做:

def create_units_from_paypal
  unit_types = params[:unit_types]
  airtime_plan = params[:airtime_plan]
  quantity = unit_types.try(:length) || 0

  #...