Почему этот GET-запрос к Rails API не работает?

#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.

Он был скомпилирован и остался там.

Когда в рабочей среде изменения, которые вы вносите в свои активы, не применяются к скомпилированным ресурсам (они скомпилированы …).

Ресурсы компилируются с единственной целью ускорить загрузку….

Итак, после каждого изменения вы должны повторно скомпилировать ресурсы, чтобы изменения вступили в силу. Это утомительный процесс (повторяю, только в стандартной производственной среде), но он необходим, если вы запускаете в рабочей среде приложение, которое все еще находится в стадии разработки (это происходит чаще, чем вы можете себе представить).

Именно по этой причине перекомпиляция ваших ресурсов и перезапуск вашего сервера приложений решат вашу проблему.