2013-05-06 2 views
0

У меня есть одно приложение, с помощью следующего кода:Как удалить специальные символы из хэша params?

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

Изменение:

quantity.times do |index| 

To:

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 

    #... 

 Смежные вопросы

  • Нет связанных вопросов^_^