【问题标题】:Rails 4, subdomain routingRails 4、子域路由
【发布时间】:2013-12-04 09:48:50
【问题描述】:

尝试通过名为“api”的 API 子域在 Rails 中实现 Web 服务。
在我的hosts 文件中,我添加了一行:127.0.0.1 api.localhost

在我的routes.rb 中,我设置了子域,我只需要索引操作和少量手动添加的静态路由,通过以下方式:

namespace :api, path: '', :constraints => {:subdomain => "api"} do
  resources :posts, only: :index do
    collection do
      get 'popular_by_day'
      get 'popular_by_week'
    end
  end
end

还生成了对应的控制器:rails g controller api/posts

测试示例:

class Api::PostsController < ApplicationController
  def index
    @posts = 1

    respond_to do |format|
        format.json  { render :json => @posts }
    end
  end

  def popular_by_day
  end

  def popular_by_week
  end
end

rake routes 之后我有以下内容:

popular_by_day_api_posts GET  /posts/popular_by_day(.:format)  api/posts#popular_by_day {:subdomain=>"api"}
popular_by_week_api_posts GET  /posts/popular_by_week(.:format) api/posts#popular_by_week {:subdomain=>"api"}
                api_posts GET  /posts(.:format)                 api/posts#index {:subdomain=>"api"}

据我所知,http://api.localhost:3000/posts 的链接应该可以工作,但我收到路由错误:
没有路由匹配 [GET] "/posts"(与 /posts.json 相同)

【问题讨论】:

  • 你可以尝试将 127.0.0.1 api.localhost 行更改为 127.0.0.1 api.localhost.local 吗?

标签: ruby-on-rails web-services api subdomain


【解决方案1】:

为 Rails 3+ 尝试http://api.lvh.me:3000

来自Ryan Bates's railscasts

如果我们去http://lvh.me:3000/,我们会看到我们的主页 应用程序,因为 lvh.me 解析到 IP 地址 127.0.0.1。这 不同之处在于我们现在可以将我们喜欢的任何子域添加到 URL 它仍然会指向同一个应用程序。

编辑:我很想知道在 cmets 中为什么反对这个答案的人会这样做。这种方法对我仍然有效。

EDIT II:更新了从 ASCII casts 到 Rails Casts 的链接,并添加了关于 Rails 3+ 的注释

【讨论】:

  • 链接已损坏。 asciicasts.com 是一个控股页面。试试railscasts.com/episodes/…
  • 还需要注意的是这是针对Rails 3的
【解决方案2】:

所以我发布了我对该主题的研究

默认情况下,Rails 将其 TLD Length 设置为 1。因此,它将无法确定 api.localhost 中的子域,从而导致路由错误。

您有几种解决方案:
- 设置一个正确的域,该域指向 127.0.0.1,tld 长度为 1(例如 dev-mywebsite.com)
- 使用 lvh.me
- 在你的 development.rb 环境文件中设置config.action_dispatch.tld_length = 0

希望这可以帮助其他有同样需要的人

编辑: 使用localhost 实际上不是一个好主意,所以在开发中设置一个 api 作为域。我发现它不适用于跨子域的 cookie

【讨论】:

    【解决方案3】:

    @Srle 看来,我昨天遇到了这个问题。

    只需尝试将“.com”添加到您的子域:api.localhost.com

    在我的应用中也可以正常工作:api.myapplication-dev.com.

    主要原因是没有.localhost域,所以把.com放到你的主机上:)

    希望它对你有用,对我有用

    【讨论】:

    • 我们可以做的另一种方法是:api.local.host :)
    【解决方案4】:

    您可以通过以下步骤实现此目的:

    1 – 在终端上以管理员用户身份登录: sudo su –

    2 – 编辑 /etc/hosts 文件 nano /etc/hosts

    上述命令将在终端中为您打开 /etc/hosts 文件。你会在那里找到几行,重要的是:

    127.0.0.1 localhost

    这是基本上将 localhost 映射到 IP 127.0.0.1 的行,在它下面添加一个新行:

    127.0.0.1 admin.localhost

    这说明新的 DNS admin.localhost 也应该映射到 IP 127.0.0.1,按 CTRL + x 存在编辑 它会要求您在存在之前保存。按 Y 保存更改。

    3 - 重新启动您的 Rails 服务器。 现在您可以通过以下 URL 访问您的本地主机 http://localhost:3000/http://admin.localhost:3000

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-09
      • 2014-02-27
      • 2012-07-30
      • 2011-11-01
      相关资源
      最近更新 更多