2015-02-05 4 views
0

Я работаю над приложением rails, которое использует внешний API Edmunds. http://developer.edmunds.com/Общие направляющие рельсы внешние API

На домашней странице я пытаюсь создать раскрывающийся список динамического выбора. Вот последовательность событий.

1) На главной странице нагрузки, отборные выпадающий заполняется всем нового автомобиль делает (Toyota, Honda и т.д.)

2) Когда пользователь выбирает конкретную марку автомобиля, появляется второй выбери выпадающий со списком всего автомобиля модели, специфичные для марки. (Camry, Accord и т. Д.)

3) Такая же последовательность возникает для конкретной отделки и стиля автомобиля. Конечным результатом является конкретный автомобиль (Toyota Camry LE 2DR).

4) Пользователь нажимает кнопку отправки, а атрибуты автомобиля сохраняются в модели автомобиля с теми же соответствующими атрибутами.

Я ищу обзор высокого уровня о наилучшем способе этого.

В настоящее время у меня динамическое поведение окна выбора корректно работает. Проблема в том, что это все JQuery и делает вызов AJAX каждый раз, когда выбирается новый make.

$.ajax({ 
    type: "GET", 
    url: "http://api.edmunds.com/api/vehicle/v2/makes?fmt=json&state=new&api_key=" + edmunds_api_key, 
    dataType: "jsonp", 
    success: function(data) { 
    var makeArray = data.makes; 
    console.log(data.makes); 
    $.each(makeArray, function(index, value) { 
     $('#make_id').append('<option value="' + value.name + '">' + value.name + '</option>'); 
    }); 
    } 
}); 

$(document).on('change', '#make_id', function() { 
    retrieve_model(this.value); 
}); 

function retrieve_model(make) { 
    $.get('https://api.edmunds.com/api/vehicle/v2/' + make + '/models? fmt=json&api_key=' + edmunds_api_key, function(data) { 
    var modelArray = data.models; 
    console.log(data.models); 
    $('#model_id').empty(); 
    $.each(modelArray, function(index, value) { 
     $('#model_id').append('<option>' + value.name + '</option>'); 
    }); 
    }); 
} 

Я знаю, что есть лучший способ сделать это. Я просто не знаю, как это сделать или что лучше всего при реализации такого приложения.

Ищете общие рекомендации относительно того, как можно было бы выполнить проект, как описано.

Нагрузка на главную страницу, могу ли я сделать 1 звонок, а затем использовать эти данные повсюду? Вместо того, чтобы делать несколько ненужных вызовов.

Я нашел много предыдущих сообщений по этой теме. Такие как .. Using ActiveRecord interface for Models backed by external API in Ruby on Rails

Большинство из них было либо над моей головой, либо для более ранних версий Rails. Любой совет?

+0

Вы можете более четко определить свои цели - пытаетесь ли вы избегать попадания в API Edumnds? Вы пытаетесь сделать это быстрее? Если это медленно, какая часть медленная? если вы посмотрите на сайт edmunds.com, они делают запрос AJAX каждый раз, когда пользователь выбирает модель, но они кэшируют ответ в браузере, поэтому во второй раз, когда вы запрашиваете ту же модель, данные возвращаются немного быстрее , – pherris

+0

Я хочу, чтобы выбор выпадал для динамического создания и сохранения результата в базе данных. Я новичок и не уверен, целесообразно ли так много запросов на внешний API. Является ли мое решение Jquery приемлемым или является решением, которое включает в себя контроллеры/модели рельсов? – swollavg

ответ

0

Я бы проверял вашу лицензию API и вычислял ожидаемый объем - они, вероятно, дросселируют вас на x соединений/секунду/час. Если вы можете жить в рамках этих ограничений, я не вижу причин не использовать API. Вы можете ввести некоторое общее кэширование для предотвращения ненужных вызовов (непроверенных):

$(document).on('change', '#make_id', function() { 
    writeModels(retrieve_model(this.value)); 
}); 

var modelCache = {}; 

function retrieve_model(make) { 
    if (modelCache[make]) { 
    return modelCache[make]; //return cached value 
    } 
    $.get('https://api.edmunds.com/api/vehicle/v2/' + make + '/models? fmt=json&api_key=' + edmunds_api_key, { 
    context: this, //needed to ensure "make" is correct in the complete callback 
    complete: function(data) { 
     var modelArray = data.models; 
     console.log(data.models); 
     modelCache[make] = data.models; //populate cache 
    } 
    }); 
} 

function writeModels(modelArray) { 
    $('#model_id').empty(); 
    $.each(modelArray, function(index, value) { 
    $('#model_id').append('<option>' + value.name + '</option>'); 
    }); 
} 
Смежные вопросы