Можно ли использовать помощники по маршруту для перенаправления из приложения Rack в Rails 3? - PullRequest
3 голосов
/ 29 декабря 2010

У меня есть простой укороченный 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) или просто лучший способ сделать это?

1 Ответ

0 голосов
/ 30 декабря 2010

Это может быть проще сделать с помощью контроллера rails, который выполняет перенаправление.Например:

маршруты:

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

в контроллере разработчика:

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