在任一 Heroku/AWS Elastic Beanstalk 上部署 Rails API

Deploying a Rails API on either Heroku/AWS Elastic Beanstalk

我正在尝试将移动客户端与 REST API 配对,以便获得可以在应用程序中显示的 JSON 数据。我在 Abraham Kuri Vargas 的 Rails 上关注 Apis。在 API 中,我创建了一个子域以及一些版本控制,因此控制器文件位于 app/controllers/api/v1 中。 API returns 需要 JSON 数据,当我在本地 运行 时。我面临的问题是,每当我将 API 部署到 Heroku/AWS 上时,它都会显示 "Application not found"。是远程服务器没有找到进入 app/controllers/api/v1 的路吗?有没有办法解决这样的问题,因为即使在作者写的书中 "Due to the structure of the application we are not going to deploy the app to any server"。我真的被这个问题困扰了很长时间,希望得到任何建议!

app/controllers/api/v1/users_controller.rb

    class Api::V1::UsersController < ApplicationController
     respond_to :json

     def show
      respond_with User.find(params[:id])
     end

     def create
     user = User.new(user_params)
      if user.save
       render json: user, status: 201, location: [ :api,user ]
      else
       render json: { errors: user.errors }, status: 422
      end
     end

     def update
     user = User.find(params[:id])
      if user.update(user_params)
       render json: user, status: 200, location: [ :api,user ]
      else
       render json: { errors: user.errors }, status: 422
      end
     end

     def destroy
      user = User.find(params[:id])
      user.destroy
      head 204
     end

     private
      def user_params
       params.require(:user).permit(:email,:password,:password_confirmation)
      end
    end

config/routes.rb

    require 'api_constraints'

    Rails.application.routes.draw do

      devise_for :users
      namespace :api, defaults: { format: :json }, constraints: { subdomain: 'api' }, path: '/'  do
        scope module: :v1, constraints: ApiConstraints.new(version: 1, default: true) do
          #resources 
          resources :users, :only => [:show, :create, :update, :destroy]
        end 
      end
    end

输出,当我在本地运行localhosts://3000/users/1

{"id":1,"email":"example@marketplace.com","created_at":"2016-06-09T05:36:06.606Z","updated_at" :"2016-06-09T05:36:06.606Z"}

Heroku 服务器在我 运行 petoye.herokuapp.com/users/1

时登录

在 2016 年 6 月 12 日开始为 120.60.22.244 获取“/users/1”06:43:36 +0000
ActionController::RoutingError(没有路由匹配 [GET] "/users/1"):
vendor/bundle/ruby/2.2.0/gems/actionpack-4.2.6/lib/action_dispatch/middleware/debug_exceptions.rb:21:in call'<br> vendor/bundle/ruby/2.2.0/gems/railties-4.2.6/lib/rails/rack/logger.rb:38:incall_app'
vendor/bundle/ruby/2.2.0/gems/activesupport-4.2.6/lib/active_support/tagged_logging.rb:68:in 标记块'<br> vendor/bundle/ruby/2.2.0/gems/activesupport-4.2.6/lib/active_support/tagged_logging.rb:68:intagged' vendor/bundle/ruby/2.2.0/gems/railties-4.2.6/ lib/rails/rack/logger.rb:20:在 调用'<br> vendor/bundle/ruby/2.2.0/gems/rack-1.6.4/lib/rack/methodoverride.rb:22:incall'
vendor/bundle/ruby/2.2.0/gems/rack-1.6.4/lib/rack/runtime.rb:18:in call'<br> 2016-06-12T06:43:36.946702+00:00 app[web.1]: vendor/bundle/ruby/2.2.0/gems/activesupport-4.2.6/lib/active_support/cache/strategy/local_cache_middleware.rb:28:in 呼唤'
vendor/bundle/ruby/2.2.0/gems/puma-3.4.0/lib/puma/server.rb:569:in handle_request'<br> vendor/bundle/ruby/2.2.0/gems/puma-3.4.0/lib/puma/thread_pool.rb:114:in块在spawn_thread'

heroku 的问题在于,如果您不为域付费,而只是使用基本服务,它会为您的应用分配一个子域。所以我需要做的就是将 heroku 重定向到自定义 url 例如 api.any_domain.com.

一个更简单的替代方法是覆盖 routes.rb 文件中 api 的约束:

  namespace :api, defaults: { format: :json }, path: '/api'  do

您现在可以在 http://herokuapp.com/api/any_endpoint

下看到 API

有关如何为 Rails API

配置 Heroku 的步骤
  1. 首先您需要使用任何注册商购买域名,假设您购买 www.example.com,这样您就可以使用像 api.example.com 这样的子域名。完成后,您需要告诉 heroku 在 api.example.com 处收听请求。这可以通过在您的 cmd

    中键入来轻松完成
    heroku domains:add api.example.com
    
  2. 使用 domains:add 命令后,您必须将您的 DNS 提供商指向由 Heroku 提供的域的 DNS 目标。这是通过创建一个类似于 example.herokuapp.com 的 CNAME 条目来完成的(键入 heroku info 以获取您的应用程序的名称)。如果您使用像 DNSimple (https://www.youtube.com/watch?v=rr6Jy9i0Cws) 这样的服务,上述过程会变得简单。基本上你添加了一个 api.example.com 的 CNAME 记录,它指向 example.herokuapp.com

  3. 每个人在部署到 heroku 后都会忘记的一件重要事情是 运行 heroku 运行 rake db:migrate 命令。

完成所有这些后,您就可以使用 api.example.com/any_endpoints

访问 api

其他资源: https://devcenter.heroku.com/articles/custom-domains https://support.dnsimple.com/articles/alias-record/