2017-12-11 5 views
0

In Rails5 API konnte ich Contraint zu Routen hinzufügen. Beispielsweise;Wie man Abfrage Parameter Constraints auf Trauben anwenden?

GET /hello => hello#index 
GET /hello?download => hello#download 

Wie Sie sehen können, sind beide URLs gleich. Der einzige Unterschied ist der zweite, der eine Beschränkung hat und wenn der Download-Parameter in der URL ist, dann wird er zu einer anderen Aktion umgeleitet.

Wie kann ich das gleiche auf Grape machen? Ich konnte keine Ressource in ihrer Dokumentation oder in der Problemliste finden.

get :hello do 
    'I am a hello world page' 
end 

aber wenn URL hat einige Abfrageparameter, die ich vorgegeben dann möchte ich dies auszuführen:

get :hello do { ?download } 
    'download a file (for example)' 
end 

Ich spielte mit params und erstellt ein requires params. Noch eins fangen die Anfrage.

Dies ist, was ich auf Rails API für die Routen verwenden:

class DownloadConstraint 
    def matches?(request) 
    request.query_parameters.key?('download') 
    end 
end 

UPDATE: ich dies klar sein wollen. Ich möchte beide Routen zusammen nutzen. Ich weiß, params Tasche kann verwendet werden, um Parameter vor der Ausführung zu verlangen. Was ich erreichen möchte, ist, dass ich Routen basierend auf GET-Parametern festlegen möchte. Siehe Rails' advanced contraints: http://guides.rubyonrails.org/routing.html#advanced-constraints

Antwort

0

einen optionalen Parameter hinzufügen und umleiten, wenn es receieved wurde:

params do 
    optional :download 
end 

get :hello do 
    redirect '/' if params[:download] 
end 
+0

Dank. Aber das funktioniert nicht. Siehe, Dies erfordert: Downloadparameter, der angegeben werden soll. Aber was, wenn ich diesen Parameter nicht schreibe? Ich möchte sie zu einer anderen Aktion umleiten. Ich möchte die Route basierend auf Parametern ausführen. Ich habe schon die Probe in meiner Frage. Ich würde gerne ': hallo' ** mit ** und ** ohne ** Parameter ** separat ** verwenden. Wenn ich das benutze, sagt Route "Download" fehlt, wenn ich es nicht auf URL setze. Siehe hier: http://guides.rubyonrails.org/routing.html#advanced-constraints – Pratha

+0

Sorry, ich habe deine Frage missverstanden. Ich würde es mit einem optionalen Parameter und einer Weiterleitung behandeln. – infused

+0

Es ist in Ordnung. Ich möchte eigentlich nicht HTTP-Redirect machen. Ich würde gerne direkt auf Anfragen reagieren, genau wie in Rails. Ich bin mir sicher, dass Trauben diese Option haben werden, aber ich weiß nicht wie. Wenn Rails kann, kann Trauben auch (ich denke). Oder gibt es eine Möglichkeit, die Anfrage intern an eine andere Methode/Route umzuleiten, ohne den Browser oder die Anfrage des Benutzers umzuleiten. – Pratha

Verwandte Themen