Подтвердить что ты не робот

Получить url на основе ограничений, используя url_for на основе установленного движка

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

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

Пример:

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

cooperate_path = > /apps/сотрудничать

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

cooperate_path = > /apps/worktogether

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

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

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

Ответ 1

Удалить .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

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

Ответ 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

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

Ответ 3

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

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