ruby-on-rails – 在Heroku / AWS Elastic Beanstalk上部署Rails API

我正在尝试将移动客户端与REST API配对,以便获取可以在应用程序中显示的JSON数据.亚伯拉罕库里巴尔加斯正在跟随Apis on Rails.在API中我创建了一个子域以及一些版本控制,因此控制器文件位于app / controllers / api / v1中.当我在本地运行它时,API返回所需的JSON数据.我面临的问题是每当我将API部署到Heroku / AWS上时,它都会显示“找不到应用程序”.是远程服务器没有进入app / controllers / api / v1吗?对于这样的问题是否有任何修复,因为即使在书中,作者也写过“由于应用程序的结构,我们不会将应用程序部署到任何服务器”.我很长时间都坚持这个问题,并且会喜欢任何建议!

应用程序/控制器/ 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

配置/ 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, “电子邮件”: “example@marketplace.com”, “created_at”: “2016-06-09T05:36:06.606Z”, “的updated_at”:“2016-06-09T05:36:06.606 Z“}

当我运行petoye.herokuapp.com/users/1时,Heroku服务器会记录

在2016-06-12 06:43:36 0000开始获取120.60.22.244的GET“/ users / 1”
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’
供应商/束/ruby/ 2.2.0 /宝石/ railties-4.2.6 / LIB /导轨/齿条/ logger.rb:38:incall_app”
vendor / bundle / ruby​​ / 2.2.0 / gems / activesupport-4.2.6 / lib / active_support / tagged_logging.rb:68:in block in tagged’
vendor / bundle / ruby​​ / 2.2.0 / gems / activesupport-4.2.6 / lib / active_support / tagged_logging.rb:68:凹进’vendor / bundle / ruby​​ / 2.2.0 / gems / railties-4.2.6 / lib / rails / rack / logger.rb:20:in call’
供应商/束/ruby/ 2.2.0 /宝石/机架1.6.4 / LIB /齿条/ methodoverride.rb:22:门店”
vendor / bundle / ruby​​ / 2.2.0 / gems / rack-1.6.4 / lib / rack / runtime.rb:18:in call’
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 :门店”
vendor / bundle / ruby​​ / 2.2.0 / gems / puma-3.4.0 / lib / puma / server.rb:569:in handle_request’
vendor / bundle / ruby​​ / 2.2.0 / gems / puma-3.4.0 / lib / puma / thread_pool.rb:114:inblock in spawn_thread’

最佳答案
有关如何为Rails API配置Heroku的步骤

>首先,您需要使用任何注册商购买域名,比如说您购买www.example.com,这样您就可以使用像api.example.com这样的子域名.完成后,您需要告诉heroku在api.example.com上收听请求.这可以通过在cmd上键入来轻松完成

heroku domains:add api.example.com

>使用domains:add命令后,您必须将DNS提供程序指向Heroku提供的域的DNS目标.这是通过创建类似example.herokuapp.com的CNAME条目(输入heroku信息以获取应用程序的名称)来完成的.如果您使用DNSimple(https://www.youtube.com/watch?v=rr6Jy9i0Cws)之类的服务,上述过程将变得简单.基本上,您添加了api.example.com的CNAME记录,该记录指向example.herokuapp.com
>一旦他们部署到heroku,每个人忘记的一件重要事情就是运行heroku run rake db:migrate命令.

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

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

转载注明原文:ruby-on-rails – 在Heroku / AWS Elastic Beanstalk上部署Rails API - 代码日志