2015-12-20 6 views
1

благодарен вам за ребята, как ресурс! Я думаю, что это должен быть простой вопрос, но пока не удалось найти простой ответ, но любая помощь/руководство было бы оценено! У меня есть «субдомен» контроллер, который настроен следующим образом:Rails 4 субдомена, привязанные к контроллеру

get 'subdomain/:store' => 'subdomain#index' 
get 'subdomain/:store/products' => 'subdomain#product_index' 
get 'subdomain/:store/products/:id' => 'subdomain#products_show' 

Как вы можете видеть, контроллер подобласти соответствует запросу с магазином ID и может также получить индекс всех сопутствующих продуктов с Идентификатор магазина. Я хотел бы каким-то образом преобразовать каждый из этих запросов в субдомен, а не в путь. Каждый магазин имеет атрибут «субдомен» (в приведенном ниже примере одна из записей «Хранилище» имеет значение поддомена «nike»).

Например

host.com/subdomain/nike => nike.host.com 
host.com/subdomain/nike/products => nike.host.com/products 
host.com/subdomain/nike/products/5 => nike.host.com/products/5 

Уведомление контроллер "подобласти" был удален из пути. Любая помощь? Я смотрел на такие драгоценные камни, как квартира, но они выглядят так, как будто они слишком сложны для этого. Также субдомен-фу, но похоже, что он устарел для Rails 4. Мысли? БЛАГОДАРЯ!

ответ

3

Для этого вы можете добавить ограничение маршрутизации.

Добавить файл в lib/subdomain_required.rb

class SubdomainRequired 
    def self.matches?(request) 
    request.subdomain.present? && request.subdomain != 'www' 
    end 
end 

Тогда в вашем routes.rb, вы можете вложить свои маршруты в contraint блок, примерно так:

constraints(SubdomainRequired) do 
    get '/' => 'subdomain#index' 
    get '/products' => 'subdomain#product_index' 
    get '/products/:id' => 'subdomain#products_show' 
end 

Теперь последний шаг, чтобы загрузить магазин на основе субдомена, который может быть выполнен с использованием before_action

class SubdomainController < ActionController::Base 
    before_action :ensure_store! 

    def index 
    @products = current_store.products.all 
    end 

    def ensure_store! 
    @store ||= Store.find_by subdomain: request.subdomain 
    head(:not_found) if @store.nil? 
    @store 
    end 

    def current_store 
    @store 
    end 
end 

теперь где угодно вы хотите получить магазин, вы можете использовать вспомогательный метод current_store.

Надеюсь, это поможет

+0

Спасибо, что это очень полезно! Существует конфликт, в котором корневой путь переопределяет get '/' ограничения субдомена: ** www.host.com маршруты к 'welcome # home' ** nike.host.com маршруты в 'welcome # home '(не перенаправляется на индекс поддомена #). Есть ли способ разрешить маршруты.rb между корнями www и subdomain? – dubc15

+0

Обновлено, чтобы избежать 'www'. в случае с www.host.com он получит контроллер, который вы определили: «welcome # home» – CuriousMind

Смежные вопросы