2016-01-02 2 views

Antwort

6

Nicht sicher, ob dies ist, was Sie fordern, aber hier geht:

router.ex im Browser-Stack

get "/products/:product_name", ProductController, :get_product_by_name 

product_controller.ex

def get_product_by_name(conn, %{"product_name" => product_name}) do 
    product = Repo.get_by(Product, name: product_name) 
    render(conn, "product_info.html", product) 
end 

Das sollte Alles was Sie brauchen, wenn Ihre Anwendung ein bestimmtes Produkt basierend auf dem Namen als HTML-Seite zurückgeben soll, müssen Sie natürlich eine HTML-Seite mit dem Namen "product_info.html.eex" unter templates/produc haben t

19

Zusätzlich zu Wobbleys Antwort ist to_param in Phoenix mit Protokollen implementiert. Zum Beispiel, hier ist, wie Sie könnte sich ändern, wie die URLs für Produkte erzeugt werden:

defimpl Phoenix.Param, for: MyApp.Product do 
    def to_param(%{name: name}) do 
    "#{name}" 
    end 
end 

Ein komplexeres Beispiel ist auch auf Programming Phoenix gezeigt (Disclaimer: Ich bin einer der Autoren).

+3

Aber die friedlichen Routen, die von Phoenix (v1.2.rc) erzeugt werden, benutzen immer noch: id als Standard-Parameternamen, du brauchst expliziten set-Parameter. "Ressourcen"/Benutzer ", UserController, Parameter:" Name "' –

+2

Schauen Sie sich auch die Dokumentation an: https://hexdocs.pm/phoenix/Phoenix.Param.html. Dieses Protokoll ist ableitbar. Das Hinzufügen von '@derive {Phoenix.Param, key:: product_name}' auf Ihrem Modell vor dem 'schema'-Aufruf sollte ausreichen, um seo-freundliche URLs zu erzeugen, ohne Ihre Vorlagen zu ändern (nur wie Sie die Datensätze abrufen Der Controller). – Eloici

Verwandte Themen