2017-05-08 4 views
0

In meiner Phoenix Anwendung eine Abfrage-String erstellen, möchte ich eine URL eine Abfragezeichenfolge hinzuzufügen:für eine URL in Phoenix

some_cool_path(@conn, :index, "view-mode": "table") 

ich erwartet, dass es eine URL wie /some_cool?view-mode=table erzeugen würde, sondern es wirft eine Ausnahme:

Wie behebe ich das?

+0

können Sie den Router Code schreiben, wo Sie diese Route definiert haben? – Dogbert

+0

@Dogbert, nur eine gewöhnliche Route 'erhalten" some_cooll ", Controller1,: action1' – Jodimoro

+0

Ihr Code ist korrekt, wenn Sie die richtigen Controller und Aktion Namen haben. Diese Fehlermeldung zeigt an, dass die Route tatsächlich einen obligatorischen Parameter in der URL aufweist. 'post_path (MyApp.Endpoint,: index," view-mode ":" Tabelle ") # =>"/posts? view-mode = table "'. Kannst du die genaue Zeile in den Router einfügen, der 'some_cool_path' Helfer generiert? – Dogbert

Antwort

2

Um eine Abfrage-String aus einer Keyword-Liste zu erstellen, können Sie URI.encode_query/1 verwenden:

iex(1)> URI.encode_query("view-mode": "table") 
"view-mode=table" 

Aber das scheint nicht hier, um das Problem zu sein. Wenn für Ihre Route bestimmte Parameter erforderlich sind, müssen Sie alle angeben, bevor Sie die Abfrage-Keyword-Liste übergeben.

Beispiel:

  • Wenn Sie Ihre Route über so etwas wie /users, Ihr Code funktionieren würde.
  • Wenn jedoch ein erforderlicher Parameter wie /users/:id vorhanden ist, müssen Sie zuerst das/die erforderliche (n) Argument (e) übergeben, bevor Sie die Schlüsselwortliste für die Abfragezeichenfolge angeben. Also für diese, sollten Sie etwas wie folgt aufrufen:

    users_path(@conn, :show, @user.username, "view-mode": "table") 
    
+0

danke. noch eine Frage: Angenommen, ich hätte eine URL mit einem "#" -> 'example.com/something # as_table' oder' example.com/something # as_chart'. Wie würde ich eine Musterübereinstimmung in einem Controller in einer Aktion erstellen oder dekonstruieren? Das heißt, es möchte den Wert nach dem '#' – Jodimoro

+0

erhalten Es heißt ein Anker oder Fragment und es ist nicht auf der Serverseite, nur Client-Seite. [Siehe diese Antwort] (http://stackoverflow.com/questions/34687098/how-to-get-the-fragment-identifier-part-of-an-url). – Sheharyar