我有一个带有以下代码的应用程序:
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 "3":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数组。
答案 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
#...