Rails 3 роутинг с пространством имен - PullRequest
5 голосов
/ 22 июля 2011

При попытке получить доступ к следующему URL, я получаю страницу ошибки 404 :

dev.mydomain.com / api

, тогда какВ моем файле rout.rb упоминается, что этот маршрут существует:

rout.rb

constraints :subdomain => 'dev' do
  root :to => 'developers/main#index', :as => :developers
  namespace 'api', :as => :developers_api do
    root :to => 'developers/apidoc/main#index'
  end
end

рейк-маршруты

         developers   /(.:format)      {:subdomain=>"dev", :controller=>"developers/main", :action=>"index"}
developers_api_root   /api(.:format)   {:subdomain=>"dev", :controller=>"api/developers/apidoc/main", :action=>"index"}

контроллер

/ app/controllers/developers/apidoc/main_controller.rb

class Developers::Apidoc::MainController < Developers::BaseController
  def index
  end
end

logs

[router]: GET dev.mydomain.com/api dyno=web.1 queue=0 wait=0ms service=14ms status=404 bytes=0
[web.1]: Started GET "/api"
[web.1]: ActionController::RoutingError (uninitialized constant Api::Developers)

Ответы [ 3 ]

5 голосов
/ 22 июля 2011

Я предполагаю, что проблема в том, что ваш маршрут указывает на api/developers/apidoc/main, но ваш класс только Developers::Apidoc::MainController. Вы не должны или пространство имен этого маршрута с api или добавить Api в пространство имен контроллера - Api::Developers::Apidoc::MainController.

3 голосов
/ 05 октября 2012

Еще один важный фактор, который следует иметь в виду, состоит в том, что пространства имен маршрутов должны сопровождаться путями каталогов, чтобы быть согласованными.Неправильное получение данных также приведет к ошибке, подобной этой:

Routing Error

uninitialized constant Api::Developers

В моем случае, у меня была такая структура маршрута:

namespace "api" do
  namespace "developers" do
    ...
  end
end

, и структура папок / каталогов должна была быть такой: приложение / контроллеры / API / разработчики /

1 голос
/ 23 апреля 2016

TL; DR Заменить namespace на scope

Учитывая следующую структуру папок

 Rails.root
  |
  +-- app/
  |    |
  |    +-- controllers/
  |         |
  |         +-- jobs_controller.rb
  +-- config/
       |
       +-- routes.rb

фрагмент ниже в routes.rb выдает ошибку ActionController::RoutingError: uninitialized constant Api:

namespace :api do
  namespace :v1 do
    resources :jobs
  end
end

пока работает следующее:

scope :api do
  scope :v1 do
    resources :jobs 
  end
end

Причина кратко упоминается в Маршрутизация с внешней стороны :

Область имен автоматически добавит :as, а также :module и :path префиксы.

И действительно, пространство имен - это просто оболочка вокруг области действия с кучей предопределенных опций:

# File actionpack/lib/action_dispatch/routing/mapper.rb, line 871
def namespace(path, options = {})
  path = path.to_s

  defaults = {
    module:         path,
    path:           options.fetch(:path, path),
    as:             options.fetch(:as, path),
    shallow_path:   options.fetch(:path, path),
    shallow_prefix: options.fetch(:as, path)
  }

  scope(defaults.merge!(options)) { yield }
end
...