Получить URL-адрес на основе ограничений, используя url_for на основе смонтированного движка
Есть ли способ, которым я могу сделать url_for, чтобы вернуть URL-адрес на основе request.host во время маршрутизации отправки действий?
mount Collaborate::Engine => '/apps/collaborate', :constraints => {:host => 'example.com' }
mount Collaborate::Engine => '/apps/worktogether'
Пример:
Когда пользователь находится на хосте example.com
ружный_путь => / приложения / совместная работа
Когда пользователь находится на любом другом хосте
laborate_path => /apps/worktogether
После долгих исследований я понял, что у класса RouteSet есть named_routes, который не учитывает ограничения для возврата URL.
Я попытался переопределить @set в action_dispatch/routing/route_set.rb для получения из приложения rails, но dint работает как положено
@search_set = Rails.application.routes.set.routes.select{|x| x.defaults[:host] == options[:host] }[0]
@set = @search_set unless @search_set.blank?
3 ответа
Удалите.com в вашем примере
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
Что касается моей заботы, если вы справитесь с этим на уровне промежуточного программного обеспечения, то это было бы хорошо. Это то, что мое предположение.
Добавьте эту строку в 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
Надеюсь, что это решит вашу проблему.!!!
Хорошо, вот выстрел в темноте; Может быть, вы уже пробовали это, или я действительно что-то упускаю. На первый взгляд, похоже, что вы просто пытаетесь переопределить вспомогательный метод пути для apps
, Так почему бы не настроить переопределение в application_helper.rb
? Что-то вроде:
module ApplicationHelper
def collaborate_path
if request.domain == "example.com"
"/apps/collaborate"
else
"/apps/worktogether"
end
end
end