2016-01-02 4 views

risposta

6

Non sono sicuro se questo è quello che stai chiedendo, ma qui si va:

router.ex nello stack del browser

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 

Questo dovrebbe essere tutto ciò di cui hai bisogno se vuoi che la tua applicazione restituisca un prodotto specifico basato sul nome come pagina HTML, naturalmente avrai bisogno di una pagina HTML con il nome "product_info.html.eex" sotto modelli/produzione t

19

In aggiunta alla risposta di Wobbley, to_param in Phoenix è implementato con protocolli. Ad esempio, ecco come si potrebbe cambiare il modo gli URL per i prodotti vengono generati:

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

Un esempio più complesso è anche visualizzato sul Programming Phoenix (disclaimer: io sono uno degli autori).

+3

Ma le rotte restful generate da phoenix (v1.2.rc) usano ancora: id come nome param predefinito, è necessario utilizzare param set esplicito. ad esempio 'risorse"/utenti ", UserController, param:" nome "' –

+2

Inoltre, dai un'occhiata ai documenti: https://hexdocs.pm/phoenix/Phoenix.Param.html. Questo protocollo è derivabile, quindi aggiungendo '@derive {Phoenix.Param, chiave:: product_name}' sul tuo modello prima che la chiamata a 'schema' sia sufficiente per generare url di seo-friendly senza modificare i tuoi template (solo come recuperi i record in il controller). – Eloici