#javascript #ruby-on-rails #api #get #typeahead.js
#javascript #ruby-on-rails #API #получить #typeahead.js
Вопрос:
Я использую следующий код для GET
всех данных Airport ( localhost:3000/api/v1/airports
), поэтому Typeahead.js может автоматически заполнять информацию об аэропорту.
$(document).on('ready page:load', function () {
var airports = new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('search_string'),
queryTokenizer: Bloodhound.tokenizers.whitespace,
limit: 10,
prefetch: {
url: window.location.origin "/api/v1/airports"
}
});
// kicks off the loading/processing of `local` and `prefetch`
airports.initialize();
// passing in `null` for the `options` arguments will result in the default
// options being used
$('.typeahead').typeahead(null, {
name: 'airports',
displayKey: 'search_string',
// `ttAdapter` wraps the suggestion engine in an adapter that
// is compatible with the typeahead jQuery plugin
source: airports.ttAdapter()
});
});
Когда я развертываю это в Heroku и посещаю страницу формы, консоль в Chrome возвращает следующее:
GET http://localhost:3000/api/v1/airports.json net::ERR_EMPTY_RESPONSE application-b3c93a17005e4f5b078b985c7fa12088.js:3
Он должен реагировать на следующий контроллер:
module Api
module V1
class AirportsController < ApplicationController
skip_before_filter :verify_authenticity_token
respond_to :json
def index
respond_with(Airport.all)
end
def search
respond_with(Airport.pluck(:search_string))
end
def show
respond_with(Airport.find(params[:id]))
end
def create
@airport = Airport.new(airport.params)
if @airport.save
respond_to do |format|
format.json { render :json => @airport }
end
end
end
def update
@airport = Airport.find(params[:id])
if @airport.update(todo_params)
respond_to do |format|
format.json { render :json => @airport }
end
end
end
def destroy
respond_with Airport.destroy(params[:id])
end
end
end
end
Вот как выглядит маршрут:
namespace :api, defaults: {format: :json} do
namespace :v1 do
get 'airports/search', to: 'airports#search', as: 'search'
resources :airports, :airlines, :countries
end
end
Это работает в моей среде разработки. Есть идеи?
Комментарии:
1. Покажите нам контроллер, на который вы ожидаете ответа, и маршрут, который должен совпадать.
2. локальный хост на Heroku???? Я так не думаю…
3. @TamerShlash Я обновил вопрос информацией. Код работает, когда я запускаю его локально.
4. @RubyRacer Простая вставка копирования.
5.
localhost:3000
там не должно быть. Должно быть соответствующее имя хоста вашего развертывания Heroku…. Выlocalhost
где-нибудь жестко запрограммировали свой код? Может быть, очистить кэш вашего браузера?
Ответ №1:
Ваши ресурсы, в частности ваш javascript, содержали жестко закодированную ссылку http://localhost:3000
на запрос GET / json, я полагаю, из какого-то теста в вашем коде javascript.
Он был скомпилирован и остался там.
Когда в рабочей среде изменения, которые вы вносите в свои активы, не применяются к скомпилированным ресурсам (они скомпилированы …).
Ресурсы компилируются с единственной целью ускорить загрузку….
Итак, после каждого изменения вы должны повторно скомпилировать ресурсы, чтобы изменения вступили в силу. Это утомительный процесс (повторяю, только в стандартной производственной среде), но он необходим, если вы запускаете в рабочей среде приложение, которое все еще находится в стадии разработки (это происходит чаще, чем вы можете себе представить).
Именно по этой причине перекомпиляция ваших ресурсов и перезапуск вашего сервера приложений решат вашу проблему.