为什么对Rails API的GET请求不起作用?

时间:2014-06-25 19:57:17

标签: javascript ruby-on-rails api get typeahead.js

我使用以下代码GET所有机场数据(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 个答案:

答案 0 :(得分:1)

您的资产,特别是您的javascript,包含了http://localhost:3000的GET / json请求的硬编码链接,我猜您的javascript代码中的某些测试。

它被编译并保留在那里。

在生产环境中,您对资产所做的更改不适用于已编译的资产(它们已编译...)。

编译资产的唯一目的是加载更快....

因此,在每次更改后,您必须重新编译资产以使更改生效。这是一个繁琐的过程(我重复一遍,仅在标准的生产环境中),但是如果你在生产中运行一个仍在开发中的应用程序(它的发生频率超出你的想象),这是必要的。

这就是为什么重新编译资产并重新启动应用程序服务器将解决您的问题。