2015-07-20 9 views
9

Vorrei impostare il tag title nel modello di applicazione, da una vista figlio/controller in Phoenix.Impostazione delle proprietà nella vista padre/modello in Phoenix

Il title tag è all'interno del template web/templates/layout/app.html.eex, ma ho un ArticlesController che rende al <%= @inner %> Venendo da Rails userei la chiamata yield, ma non riesce a trovare il suo equivalente a Phoenix.

Qual è il modo corretto per passare le proprietà al modello principale/vista dal relativo figlio?

+3

Questo post copre proprio questo: http://sevenseacat.net/2015/06/01/custom_page_titles_in_phoenix.html –

+0

Grazie José! Questo è molto utile! –

+0

3 opzioni presentate qui: http://cloudless.studio/articles/27-implementing-page-specific-titles-in-phoenix –

risposta

8

Hai un paio di opzioni qui. Presumo che tu voglia qualcosa come content_for in rotaie.

Una possibilità è quella di utilizzare render_existing/3http://hexdocs.pm/phoenix/0.14.0/Phoenix.View.html#render_existing/3

Un altro modo flessibile è quello di utilizzare una spina:

defmodule MyApp.Plug.PageTitle do 

    def init(default), do: default 

    def call(conn, opts) do 
    assign(conn, :page_title, Keyword.get(opts, :title) 
    end 

end 

Poi, nel tuo controller che si può fare

defmodule FooController do 
    use MyApp.Web, :model 
    plug MyApp.Plug.PageTitle, title: "Foo Title" 
end 

defmodule BarController do 
    use MyApp.Web, :controller 
    plug MyApp.Plug.PageTitle, title: "Bar Title" 
end 

E nel modello;

<head> 
    <title><%= assigns[:page_title] || "Default Title" %></title> 
</head> 

Qui usiamo assigns invece di @page_title perché @page_title alzerà se il valore non è impostato.

+1

Grazie Gazler! Sono stato in grado di risolvere questo problema usando il tuo consiglio per il modello e aggiungendo 'page_title:" un titolo "' alla chiamata 'render' nell'azione del controller. –

Problemi correlati