@Quty

Как добиться правильного роутинга поддоменов в Rails 4?

Пытаюсь выделить поддомен 'admin' в приложении. Командой rails g controller Admin::Users создал необходимый контроллер в пространстве имен Admin, получилось так:
class Admin::UsersController < Admin::ApplicationController
  
  def index
    @users = User.all
  end
  
  def show
    @user = User.find(params[:id])
  end
  
end

Сам Admin::ApplicationController представляет из себя следующее:
class Admin::ApplicationController < ActionController::Base
  http_basic_authenticate_with name: "admin", password: "secret"
  layout "admin/application"
end

В config/routes.rb прописал

TestApp::Application.routes.draw do
# ...
  namespace :admin do
    constraints subdomain: "admin" do
      resources :users
    end
  end
#...
end

rake routes выдает

admin_users GET    /admin/users(.:format)          admin/users#index {:subdomain=>"admin"}
                POST   /admin/users(.:format)          admin/users#create {:subdomain=>"admin"}
 new_admin_user GET    /admin/users/new(.:format)      admin/users#new {:subdomain=>"admin"}
edit_admin_user GET    /admin/users/:id/edit(.:format) admin/users#edit {:subdomain=>"admin"}
     admin_user GET    /admin/users/:id(.:format)      admin/users#show {:subdomain=>"admin"}
                PATCH  /admin/users/:id(.:format)      admin/users#update {:subdomain=>"admin"}
                PUT    /admin/users/:id(.:format)      admin/users#update {:subdomain=>"admin"}
                DELETE /admin/users/:id(.:format)      admin/users#destroy {:subdomain=>"admin"}

По URL http://admin.lvh.me:3000/admin/users/ роутинг проходит нормально, но в таком случае 'admin' дублируется в пути. В попытках от этого избавить заменил
namespace :admin do
на
namespace :admin, path: '' do

В этом случае rake routes выдает, казалось бы, вменяемый результат.

admin_users GET    /users(.:format)          admin/users#index {:subdomain=>"admin"}
                POST   /users(.:format)          admin/users#create {:subdomain=>"admin"}
 new_admin_user GET    /users/new(.:format)      admin/users#new {:subdomain=>"admin"}
edit_admin_user GET    /users/:id/edit(.:format) admin/users#edit {:subdomain=>"admin"}
     admin_user GET    /users/:id(.:format)      admin/users#show {:subdomain=>"admin"}
                PATCH  /users/:id(.:format)      admin/users#update {:subdomain=>"admin"}
                PUT    /users/:id(.:format)      admin/users#update {:subdomain=>"admin"}
                DELETE /users/:id(.:format)      admin/users#destroy {:subdomain=>"admin"}

Вот только роутинг по URL вида http://admin.lvh.me:3000/users/:id/[edit] направляет запрос не в Admin::Users, а в Users.

Rails 4.0.2, Ruby 2.0.0p643
  • Вопрос задан
  • 384 просмотра
Решения вопроса 1
Jeiwan
@Jeiwan
Как-то так:
constraints subdomain: 'admin' do
  scope module: 'admin', as: 'admin' do
    resources :users
  end
end
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы