2017-10-18 5 views
0

En supposant que j'ai une application agence de Voyage avec cette ressource:itinéraires complexes avec des contraintes

mix phx.gen.html Flights Flight flights departure destination 
           starts_on ends_on 
           flight_number price:integer 

Je veux afficher tous les vols qui correspondent à une URL demandant dans un modèle d'index. Mais je veux avoir cela disponible avec un itinéraire comme kayak.com: http://localhost:4000/flights/FRA-MIA/2017-12-01/2017-12-08

Dans le document officiel à https://hexdocs.pm/phoenix/routing.html Je ne trouve pas un exemple de quelque chose de similaire à cela. J'ai besoin de FRA, MIA, 2017-12-01 et 2017-12-08 comme paramètres.

L'itinéraire généré est la suivante:

resources "/flights", FlightController 

Je suppose que je pourrais utiliser la fonction get_flight!/1 pour diviser le id mais qui se sent sale. Y a-t-il un meilleur moyen?

Dans Ruby on Rails j'utiliser quelque chose comme match "/flights/:from-:destination/:year(/:month(/:day))..." => "flights#index", :constraints => { :year => /\d{4}/, :month => /\d{2}/, :day => /\d{2}/ }

Comment puis-je résoudre ce problème à Phoenix?

Répondre

0

lib/xyz_web/router.ex

get "/flights/:departure/:destination/:starts_on/:ends_on", PageController, :index 

Entraînera ceci:

[info] GET /flights/FRA/MIA/2017-12-01/2017-12-08 
[debug] Processing with XyzWeb.PageController.index/2 
    Parameters: %{"departure" => "FRA", "destination" => "MIA", 
    "ends_on" => "2017-12-08", "starts_on" => "2017-12-01"} 
    Pipelines: [:browser] 

Bien sûr, qui est sans les contraintes.

Le contrôleur:

def index(conn, %{"starts_on" => starts_on, "ends_on" => ends_on, 
        "departure" => departure, 
        "destination" => destination }) do 
    what_ever = ... 
    render(conn, "index.html", what_ever: what_ever) 
end