1) Как вы справляетесь с такими сценариями?
Общий ответ будет выглядеть так:
class LandingsController < ApplicationController
before_filter :login_required
def index
...
end
...
private
def login_required
if not_logged_in? # This methods depends on your authentication strategy
send_file "/your/static/path/#{params[:action]}", :type => "application/html charset=utf8;"
return false # Halt chain
end
end
документация send_file
И, в зависимости от соответствия между каждым вашим действием и вашими шаблонами, вы можете дополнительно абстрагировать метод login_required
в ApplicationController и проверить, существует ли файл.
2) Есть ли способ избежать входа в стек Rails для статических страниц
Да. Вы должны поверить мне на слово, потому что я сам этого не сделал, но вы можете использовать промежуточное программное обеспечение Rack для этого. Вот пример того, как сделать что-то подобное, за исключением того, что вместо перенаправления файл будет обслуживаться статически (просто задайте заголовки и результаты File.read как содержимое). Это зависит от тем не менее, библиотека аутентификации, с которой вы работаете.
3) Есть ли настройка для метода root_path, чтобы он возвращал разные
корень на основе контекста
Вы не можете определить условный маршрут (т. Е. Определить несколько маршрутов в файле routes.rb
), но вы можете переопределить метод root_url
в ApplicationController, если вы используете именованный путь root
в определениях вашего маршрута , Что-то вроде
class ApplicationController
def root_url(*options)
if logged_in?
"/return/something/custom"
else
super(*options)
end
end
end
Это, однако, звучит действительно плохая идея, так как 1) Вы должны указать на тот же URL и позволить контроллеру обработать запрос (ваши ссылки не должны указывать, куда вас направить), и 2) Это может потенциально сломать другие вещи, которые полагаются на методы root_url
и root_path
.