0

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

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 参数查询字符串将数据发送到我的其他应用程序。这是其他应用程序的控制器方法的样子:

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>

我尝试使用 bothrawhtml_safeon theparams[:quantity]和 other params,但仍然出现错误。注意我必须使用URI.encode(url),因为URI.parse(url)返回了错误的 uri 可能是因为 unit_types 数组。

4

1 回答 1

1

改变:

 quantity.times do |index|

至:

 quantity.to_i.times do |index|

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

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

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

  #...
于 2013-05-06T16:32:26.563 回答