2015-12-07 7 views
10

Есть ли способ, которым я могу сделать url_for для возврата URL-адреса на основе request.host во время маршрутизации отправки?Получить url на основе ограничений, используя url_for на основе смонтированного двигателя

mount Collaborate::Engine => '/apps/collaborate', :constraints => {:host => 'example.com' } 
mount Collaborate::Engine => '/apps/worktogether' 

Пример:

Когда пользователь находится на example.com хозяина

collaborate_path =>/приложений/сотрудничающие

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

c ollaborate_path =>/приложения/worktogether

После долгих исследований, я понимаю, что RouteSet класс имеет named_routes, который не учитывает ограничения, чтобы вернуть URL.

Я попытался перекрывая @set в action_dispatch/маршрутизации/route_set.rb пикап от применения рельсов, но вмятина работы, как ожидается,

@search_set = Rails.application.routes.set.routes.select{|x| x.defaults[:host] == options[:host] }[0] 
@set = @search_set unless @search_set.blank? 

ответ

1

Хорошо, вот выстрел в темноте; возможно, вы уже это пробовали или, может быть, я чего-то не хватает. На первый взгляд, похоже, что вы просто пытаетесь переопределить метод помощника пути для apps. Так почему бы не настроить переопределение в application_helper.rb? Что-то вроде:

module ApplicationHelper 
    def collaborate_path 
    if request.domain == "example.com" 
     "/apps/collaborate" 
    else 
     "/apps/worktogether" 
    end 
    end 
end 
2

Что касается моей озабоченности, если вы справляетесь с этим на уровне промежуточного уровня, это было бы хорошо. Это мое предположение.

Добавьте эту строку в config/application.rb

config.middleware.insert_before ActionDispatch::ParamsParser, "SelectiveStack" 

Добавить промежуточное программное обеспечение в каталоге приложения с каталогами промежуточного слоя, как Конвенция

app/middleware/selective_stack.rb

class SelectiveStack 
    def initialize(app) 
    @app = app 
    end 

    def call(env) 
    debugger 
    if env["SERVER_NAME"] == "example.com" 
     "/apps/collaborate" 
    else 
     "/apps/worktogether" 
    end 
    end 


end 

Надеется, что это позволит решить проблему . !!!

7

Удалить.ком в вашем примере

mount Collaborate::Engine => '/apps/collaborate', :constraints => {:host => 'examplesite' } 
mount Collaborate::Engine => '/apps/worktogether' 

Если просто работать

Если вам нужно более продвинутое ограничение, сделать свои собственные ограничения:

class CustomConstraint 
    def initialize 
    # Things you need for initialization 
    end 

    def matches?(request) 
    # Do your thing here with the request object 
    # http://guides.rubyonrails.org/action_controller_overview.html#the-request-object 
    request.host == "example" 
    end 
end 

Rails.application.routes.draw do 
    get 'foo', to: 'bar#baz', 
    constraints: CustomConstraint.new 
end 

Вы также можете указать ограничения как лямбда:

Rails.application.routes.draw do 
    get 'foo', to: 'foo#bar', 
    constraints: lambda { |request| request.remote_ip == '127.0.0.1' } 
end 

источник: http://guides.rubyonrails.org/routing.html#advanced-constraints

+0

Это помогает только в том случае, когда мы получаем путь к пути, доступ к которому осуществляется по пути UNC_CAT_NAME, и фактически не принимает хост в ограничение для возврата фактического пути. –

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

  • Нет связанных вопросов^_^