У меня есть простой укороченный URL-адрес, который base 62 кодирует номер идентификатора моей модели разработчика и возвращает что-то вроде этого в виде URL:
http://example.com/d/dYbZ
Я монтировал приложение стойки в свой файл routes.rb
:
match '/d/:token' => DeveloperRedirectApp
... и мое простое приложение Rack выглядит так:
class DeveloperRedirectApp
# no worky:
#def initialize(app)
# @app = app
#end
def self.call(env)
request = Rack::Request.new(env)
token = request.path_info.sub("/d/", "")
dev_id = token.b(62).to_s(10)
if dev = Developer.find_by_id(dev_id)
# developer_path also doesn't work since @app is not defined
location = @app.developer_path(dev)
else
# same here
location = @app.root_path
end
[301, {"Location" => location}, self]
end
def self.each(&block)
end
end
Проблема в том, что ... очевидно, что вызов initialize отправляется только экземпляру приложения rails, если онреальное промежуточное ПО, а не просто приложение стойки, смонтированное в файле маршрутов.Промежуточное программное обеспечение не имеет смысла для меня, поскольку оно должно запускаться только в том случае, если запрошен URL-адрес вида /d/:token
, а не при каждом запросе.
Я просто пытаюсь выполнить простое декодирование base 62, затем перенаправить на декодированный идентификатор разработчика (если он существует, в противном случае перенаправить на root_url).Есть ли способ доступа к помощникам маршрута (например, developer_path
) или просто лучший способ сделать это?