Как получить именованный маршрут из приложения Rack, размещенного в Rails 3?

#ruby-on-rails #ruby-on-rails-3 #routes #rack

#ruby-on-rails #ruby-on-rails-3 #маршруты #rack

Вопрос:

Возможно ли получить значение именованного маршрута из с помощью в пользовательском приложении rack, когда приложение смонтировано в rails 3 (в моем случае приложение Sinatra)?

Простое использование маршрута (login_path) вызывает исключение для неопределенной локальной переменной.

Обновить:

Вот пример того, что я пытаюсь сделать:

 before do
 redirect login_path unless some_condition
end
  

Приложение монтируется с

 mount App.new, :at => '/path'
  

Эта часть работает так, как ожидалось.

Спасибо, Скотт

Комментарии:

1. Я этого не пробовал, но они случайно не отображаются в списке при запуске rake routes не так ли?

2. Пожалуйста, покажите нам, как монтируется ваше приложение.

3. @Ryan — Мое приложение смонтировано с помощью mount App.new, :at => ‘/ path’ Это работает, как ожидалось. Мой вопрос заключался в том, как на самом деле использовать именованные маршруты из with в моем приложении. Я дополню свой первоначальный вопрос лучшим примером.

Ответ №1:

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

Поэтому вместо этого лучше сделать это в приложении rails.

Если вы используете devise, вы можете окружить свой блок монтирования следующим образом:

 authenticate "user" do
  mount App.new, :at => '/path'
end
  

Это можно сделать, потому что devise сам по себе является промежуточным программным обеспечением, добавленным перед route.

Devise реализует это как:

 def authenticate(scope)
  constraint = lambda do |request|
    request.env["warden"].authenticate!(:scope => scope)
  end
  constraints(constraint) do
    yield
  end
end
  

Если вы не используете devise, возможно, вам потребуется реализовать что-то подобное.

Ответ №2:

Я думаю, что это невозможно, потому что у них отдельный код. Вы просто указываете rails, что делать с определенными путями, а оно направляет эти запросы в другое приложение rack, они ничего не сообщают о внутреннем коде.

может быть, вы можете написать какой-нибудь код, чтобы сообщить Sinatra, как читать rails routes. хорошее место для начала:

http://apidock.com/rails/ActionDispatch