Вопрос по namespaces, routes, ruby-on-rails-3, ruby-on-rails, nested-routes – маршрут к вложенному пространству имен идет на неправильный контроллер

1

Используя Rails 3.0.7, я создаю API для нашего приложения, и у меня есть такая настройка:

routes.rb

<code>  namespace :api do
    namespace :v1 do
      match "connect" => "users#login", :via => :post
      match "disconnect" => "users#logout", :via => :post
      resources :users
      match "users/:id/foos" => "foos#list", :via => :get
      match "users/:id" => "users#update", :via => :put
      match "foos/:id/bars" => "bars#list_by_foo", :via => :get
      match "foos/:id" => "foos#show", :via => :get, :constraints => { :id => /\d+/ }
      match "bars/:id" => "bars#show", :via => :get
    end
  end

  # other routes here e.g.
  match "users/find" => "users#find_by_name", :via => :get
  match "users" => "users#create", :via => :post
</code>

И тогда у меня есть мой регулярныйapp/controllers/application_controller.rb а такжеapp/controllers/users_controller.rb файлы, а также мойapp/controllers/api/v1/application_controller.rb а такжеapp/controllers/api/v1/users_controller.rb файлы, которые определены следующим образом:

<code>class Api::V1::ApplicationController < ApplicationController
  before_filter :verify_access

  def verify_access
    # some code here
  end
end

class Api::V1::UsersController < Api::V1::ApplicationController
  skip_before_filter, :except => [:show, :update, :delete]
end
</code>

И раньше казалось, что все работает правильно, пока я не переопределил метод, который используется как UsersController, так и Api :: V1 :: UsersController - и теперь кажется, что все указывает на UsersController, хотя я и получаю доступ через api / v1 / маршрут пользователей.

Я в своем уме, пытаясь понять это. Какие-либо предложения? Благодарю. PS - не стесняйтесь комментировать любые условные обозначения, которые я игнорирую, что я не должен быть, или другие вещи, которые я мог испортить :)

Оказывается, мне просто нужно было сделать все имена моих контроллеров уникальными, независимо от пространства имен.Here's a link that helped paulnsorensen

Ваш Ответ

2   ответа
0

skip_before_filter также general принимает параметр символа для фильтра before, чем вы хотите пропустить. Имена контроллеров не должны быть уникальными, если применяется правильная область видимости / пространства имен.

пример

api/users_controller admin/users_controller users_controller

затем код на контроллер

class Api::V1::UsersController < Api::V1::BaseController
end

class Admin:UsersController < Admin::BaseController
end

class UsersController < ApplicationController
end

Тогда маршруты

MyApp::Application.routes.draw do

scope :module => "api" do
  namespace :v1 do
    resources :users
  end
end

namespace :admin do
  resources :users
end

  resources :users
end
0

Rails немного сбивает с толку, но у меня была похожая проблема. Вот некоторые шаги, которые вы можете предпринять, чтобы убедиться, что вы не пропустили небольшие проблемы с кодом. (это в конечном итоге привело меня к обнаружению синтаксической ошибки в контроллере пространства имен).

run bundle exec rake routes to generate a list of what route links to what controller and action. If this is good, then move to step 2. If not, fix your routes file and try again. (many good tutorials on this, so I won't go into detail)

Go into the rails console, and just load the controller class. If it doesn't work, you may have discovered a bug in syntax. Here's what happened on console when I tried to load the Api::V2::CampaignsController.

irb> Api::V2::CampaignsController

=> CampaignsController

Примечание: Rails направляет все запросы к неправильному контроллеру (на основе причудливой логики Rails для загрузки классов контроллеров). Следует перейти к Api :: V2 :: CampaignsController, но вместо этого он загружает CampaignsController.

Вы также можете проверить это в консоли:

> app.get '/api/v2/campaigns.json'
> app.controller.class
=> CampaignsController
# This is not the expected controller. 

В итоге это стало проблемой синтаксиса в классе, который я расширял из Api :: V2 :: CampaignsController.

Это было немного ошеломляющим, но надеюсь, что это поможет кому-то еще.

Похожие вопросы