【问题标题】:Possible to use route helpers to redirect from a Rack app in Rails 3?可以使用路由助手从 Rails 3 中的 Rack 应用程序重定向吗?
【发布时间】: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


    【解决方案1】:

    使用执行重定向的 rails 控制器可能更容易做到这一点。例如:

    路线:

    get "/d/:token" => "developers#redirect"
    

    在开发者控制器中:

    def redirect
      #magic goes here, use params[:token]
      redirect_to some_url
    end
    

    【讨论】:

    • 是的,你是对的。我希望通过 Rack 应用程序来提高速度,但这可能不值得麻烦。谢谢。
    猜你喜欢
    • 2016-02-14
    • 2011-08-04
    • 2010-09-25
    • 2014-10-27
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多