2011-11-10 7 views
2

私は何時間も試してきましたが、私のやり方で自分のルートを設定する方法はまだありません。私が達成したい何sinatraの経路定義のパラメータを使用します

は次のとおりです。

http://fooo.bar/prefix1234

私はspecifixの接頭辞で始まるすべてのものをキャプチャしたいです。

かなり簡単:

get "/prefix:id" do 
puts params[:id] 
end 

しかし、私はそれが固定された接頭辞になりたくありません。私は

設定ファイルにプレフィックスを入れたいsettings.rb: セット:接頭辞、「前」

get "/#{settings.prefix}:id" do 
puts params[:id] 
end 

これはシナトラのために(未定義のメソッド `接頭辞」を動作しません::アプリケーション:クラス(NoMethodError))。私も正規表現でキャプチャしてみました:

before do 
@prefix = settings.prefix 
end 

get %r{#{@prefix}(\d+)} do |id| 
puts "Params: #{id}" 
end 

これは

誰もが何かを得たのいずれか(URLがキャプチャされません)は動作しませんか?

+0

Sinatraルートでは、レール(上から下)と同じ方法で処理される場合は、最後に「/ *」のようなルートを定義できます。 – Bohdan

+0

他のURLとは異なる接頭辞を持つURLを処理したいので、これも私が探している解決策ではありません – leifg

答えて

2

String/Regexpはすぐに生成されます。これはうまくいきます:

require 'sinatra' 
set :prefix, '/foo' 

get "#{settings.prefix}/bar" do 
    request.path_info 
end 
+0

私はそれを試してみました。しかし、私は前にそれを試したと確信しています...奇妙な – leifg

+0

OK問題を覚えています:このコードで、すべての私のテストは正常に実行されますが、アプリケーションを起動すると、 :Sinatra :: Application:Class(NoMethodError)の未定義メソッド 'prefix ' – leifg

+0

Sinatraチケットに記載されているように:ルートをロードする前に*その設定を*設定する必要があります。 –

3

私はあなたの事例をほとんど変更することなく動作させることができました。これで、私があなたが記述したことをすることができました:

before do 
    @prefix = "test" 
end 

get %r{#{@prefix}(\d+)} do |c| 
    puts "#{@prefix} #{c}" 
    erb :test, :locals => {:id => c} 
end 

出力をテストするためにshotgunを実行し、/ test123を呼び出しました。出力されました:

テスト123

私の見解でも、これは正常に動作していたことを改めて表明しました。問題は、URLが取得されていないことであるならば、あなたはより多くのようになるように、あなたの構造を再編成する必要があります。後者は、あなたのアプリケーションのための実現可能である場合

before do 
    @prefix = "test" 
end 

get "/#{@prefix}/:id" do 
    puts "#{@prefix} #{params[:id]}" 
    erb :test, :locals => {:id => params[:id]} 
end 

が、私は知りませんが、あなたの場合ルーティングで十分に具体的ではない場合は、頻繁に悪いマッチであなた自身を開いています。私の経験では、アプリケーションがよりRESTfulであればあるほど、これらのタイプの操作を記述する時間が来ると、より良い結果が得られます。

また、設定を保存してスクリプトで解析したYAMLファイルを使用すると、より良い結果が得られます。例えば、これらの内容で、YAMLファイル:

prefix: test 

そしてこれは、次のようになり、ことを解析し、ヘルパースクリプト:

helpers do 
    def config 
    @config = YAML.load_file("config.yml") 
    end 
end 

あなたはその後、これであなたの前のブロックを置き換えることができます:

before do 
    @prefix = config["prefix"] 
end 

私のコーディングの好みは私がYAMLメソッドを使用してに傾く作るが、私はこれらのソリューションのいずれかが実行可能であるべきだと思います。

+0

提案をいただきありがとうございます。しかし、最初のものだけが実行可能であり、残念なことに、この1つは(完全に)動作していません。 yesの場合、 "/ test123"を取得してURLを取得します。しかし、 "/ something123"を取得すると、URLもキャプチャされます。変数@prefixはルート内では常に空であると思われます – leifg

関連する問題