2010-12-29 6 views
3

私は62をベースにシンプルなURL短縮は、私の開発モデルのID番号を符号化し、URLとしてこのようなものを返します:Rails 3のRackアプリからリダイレクトするためにルートヘルパーを使用できますか?

http://example.com/d/dYbZ 

私は以下のようなものを私のroutes.rbファイル内のラックアプリを搭載しました:

match '/d/:token' => DeveloperRedirectApp 

...と私のシンプルなラックアプリは次のようになります。

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 

問題がある...明らかに初期化呼び出しがありますルートファイルにマウントされたラックアプリだけでなく、実際のミドルウェアの場合にのみ、レールアプリインスタンスを送信しました。ミドルウェアは、すべてのリクエストではなく、/d/:tokenという形式のURLが要求された場合にのみ実行する必要があるため、私には分かりません。

単純なベース62デコードを行い、デコードされたデベロッパーIDにリダイレクトしようとしています(存在する場合は、それ以外の場合はroot_urlにリダイレクトします)。ルートヘルパー(つまり、developer_path)にアクセスする方法はありますか、これを行うには単により良い方法ですか?

答えて

0

リダイレクトを実行するレールコントローラで簡単に行うことができます。例えば:

ルート:開発者用コントローラで

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

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

うん、あなたは正しいです。私は、Rackアプリを通してそれをやって少しスピードを上げることを望んでいたが、それはおそらく問題の価値がない。ありがとう。 – markquezada

関連する問題