Администратор пространства имен Rails на пользовательском субдомене

Мое приложение rails настроено на использование поддоменов, как описано в этом RailsCast:

http://railscasts.com/episodes/221-subdomains-in-rails-3

Теперь я хотел бы добавить субдомен администратора перед субдоменом моего блога следующим образом:

admin.company.lvh.me:3000

Я пытался администрировать пространство имен за пределами моего ограничения поддомена:

namespace :admin, path: '/', constraints: { subdomain: 'admin' } do
  constraints(Subdomain) do
    match     '/',            to: 'blogs#show', via: 'get'
  end
end

Но вместо маршрутизации через мое приложение/контроллеры/admin/blogs_controller он пытается маршрутизировать через мой «обычный пользовательский» контроллер (app/controllers/blogs_controller).

Я просто пропустил что-то простое или сделать что-то подобное в рельсах намного сложнее?


person bigLund8    schedule 27.04.2014    source источник


Ответы (2)


Я смог решить это, хотя это кажется немного хакерским. Понимая, что Rails рассматривает ограничения как истинные или ложные, я установил другое ограничение внутри начальной проверки ограничений поддомена. Он разбивает поддомен на 2 и проверяет первый поддомен, чтобы увидеть, равен ли он «admin». Если true, он перенаправляется к admin/controllers и admin/views (из-за модуля: "admin"), если нет, он перенаправляется к менее конкретным маршрутам, которые не находятся внутри модуля "admin". .

Сначала у меня не было пространства имен :admin, и мои помощники маршрутов были неправильными (маршруты администратора не имели префикса «admin», а менее конкретные маршруты не устанавливались, так как они дубликаты). Как только я добавил namespace :admin и путь: "" (это тоже важно, поскольку удаляет "admin/" из шаблона URI), все заработало!

И последнее, в admin/controllers вам нужно отредактировать метод set_blog, поскольку вместо него интерпретируется «admin.company» (см. admin/blogs_controller.rb).

маршруты.rb

Blog::Application.routes.draw do
  constraints(Subdomain) do
    namespace :admin, module: "admin", path: "", constraints: lamda { |r| r.subdomain.split('.')[0] == 'admin' } do
      match '/', to: 'blogs#show', via: 'get'
      ...
    end

    match '/', to: 'blogs#show', via: 'get'
    ...
  end
  ...
end

Рейк Маршруты:

Prefix Verb URI Pattern Controller#Action
 admin GET  /   admin/blogs#show
 ...

ПОЛУЧИТЬ / блоги # показать ...

admin/blogs_controller.rb

BlogController < ApplicationController
  before_action :set_blog
  ...
  private
    set_blog
      @blog = Blog.find_by_subdomain!(request.subdomain.split('.')[1])
    end
end

Дайте мне знать, если есть что-то более чистое, если нет, надеюсь, это поможет другим решить эту проблему.

person bigLund8    schedule 30.04.2014

Здесь есть несколько важных факторов

Во-первых, вам нужно посмотреть, как выглядят параметры ограничения с «мульти» субдоменами. Вместо разделения Rails может иметь admin.company в качестве поддомена.

Если принять идею о том, что Rails разделит поддомены на два, какой из них будет называться «родительским»?

namespace :admin, path: '/', constraints: { subdomain: 'admin' } do
  constraints(Subdomain) do
    resources :blogs, only: :show, path_names: { show: "" }
  end
end

Если вы предоставите нам дополнительную информацию о запросе (параметры и т. д.), мы будем в гораздо лучшем положении, чтобы помочь!

person Richard Peck    schedule 27.04.2014
comment
У меня есть администраторы, отвечающие за определенные блоги, поэтому родительским доменом должно быть имя блога. Администратор в этом случае не имеет права изменять другие блоги, только свой собственный. Обычные пользователи посещают company.lvh.me, а администраторы посещают admin.company.lvh.me. - person bigLund8; 27.04.2014
comment
Я попробовал новую стратегию, похоже, она должна работать, но все еще пренебрегает пространством имен. - person bigLund8; 29.04.2014
comment
Какова твоя новая стратегия, приятель? - person Richard Peck; 29.04.2014