2013-04-02 12 views
10

Ich muss einige Methoden mit Sinatra machen, die aussehen sollte:Sinatra und Fragezeichen

http //: localhost: 1234/add string_to_add

Aber wenn ich erkläre es so :

get "/add?:string_to_add" do 
... 
end 

es finden sie in der string_to_add param nicht.

Wie soll ich meine Methode deklarieren und diesen Parameter verwenden, damit die Dinge funktionieren?

+0

Haben Sie dieses http://stackoverflow.com/questions/529065/how-to-use-params-with-slashes-with-sinatra gesehen? – Shmidt

+0

Diese Lösung funktioniert nicht, wenn ich "?" statt '/' vor '*' – earsonheart

Antwort

17

In einer URL trennt ein Fragezeichen der path Teil aus dem query Teil. Der Abfrageteil besteht normalerweise aus Name/Wert-Paaren und wird oft von einem Webbrowser erstellt, um die Daten zu vergleichen, die ein Benutzer in ein Formular eingegeben hat. Zum Beispiel könnte eine URL wie folgt aussehen:

http://example.com/submit?name=John&age=93 

Hier wird der Streckenabschnitt in /submit, und die Abfrageabschnitte name=John&age=93, die für die name Taste und „93“ für die age auf den Wert „John“ bezeichnet.

Wenn Sie create a route in Sinatra, geben Sie nur den Pfad Teil. Sinatra analysiert dann die Abfrage und stellt die darin enthaltenen Daten im Objekt params zur Verfügung. In diesem Beispiel könnten Sie so etwas tun:

get '/submit' do 
    name = params[:name] 
    age = params[:age] 
    # use name and age variables 
    ... 
end 

Wenn Sie ein ? Zeichen verwenden, wenn eine Sinatra Route definieren, ist es Teil der URL optional. In dem von Ihnen verwendeten Beispiel (get "/add?:string_to_add") stimmt es mit einer beliebigen URL überein, die mit /ad beginnt, dann optional mit einer weiteren d, und dann wird alles weitere in den Schlüssel :string_to_add des params-Hashs eingefügt, und der Abfrageabschnitt wird separat analysiert. Mit anderen Worten macht das Fragezeichen das vorangestellte d Zeichen optional.

Wenn Sie den 'rohen' Text der Abfragezeichenfolge in Sinatra erhalten möchten, können Sie die query_string method of the request object verwenden. In Ihrem Beispiel, das in etwa so aussehen würde:

get '/add' do 
    string_to_add = request.query_string 
    ... 
end 

Beachten Sie, dass die Route nicht den /add? Charakter, nur die Basis enthält.

0

Sie sollten es als erklären:

get "/add?:string_to_add?" do 
... 
end