【发布时间】:2011-05-31 23:47:06
【问题描述】:
我有一个简单的 url 缩短器,它以 62 为基数对我的 Developer 模型的 id 号进行编码,并以 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 应用程序实例,而不仅仅是安装在路由文件中的机架应用程序。中间件对我来说没有意义,因为它只需要在请求 /d/:token 形式的 url 时运行,而不是在每个请求上运行。
我只是尝试进行简单的 base 62 解码,然后重定向到解码后的开发者 ID(如果存在,则重定向到 root_url 否则)。有没有办法访问路由助手(即developer_path)或者只是一种更好的方法来做到这一点?
【问题讨论】:
标签: ruby-on-rails routing rack