2017-02-21 4 views
3

フェニックスフレームワークには、ルート/パスに基づいてページタイトルを設定する一般的な手法があります。または、これはちょうどassign(:page_title, "fred")私のルーティングされた機能の中の正しい点に電話するのですか?Phoenix Framework - ルートごとのページタイトル

更新

私は、@ michalmuskalaのソリューションのバリエーションを実装することになりました。私の代わりに@view_templateのアクション名を渡す:

<title><%= @view_module.title(action_name(@conn), assigns) %></title> 

[表示モジュールのコードは次のようになります。

def title(:show, assigns), do: assigns.user.name <> " (@" <> assigns.user.user_name <> ")" 
def title(:edit, _assigns), do: "Edit Profile" 
def title(_action, _assigns), do: "User related page" 

上記のコードの最後の文はオプションであるため、「すべてをキャッチ」モジュール(と私はおそらくトランジション中にのみ行うでしょう)

+1

私は通常、各コントローラのアクションから 'title'を' render'呼び出しに渡します。ページタイトルがコントローラ名やアクション名に適用されたロジックに基づいている場合は、プラグを使用できます。 – Dogbert

答えて

14

タイトルを扱うための素晴らしいアプローチは、そのビューが他のすべてのもののようなモジュールであることを認識することです。つまり、追加の関数を定義することができます。一方、レイアウトでは現在のビューモジュールにアクセスできます。つまり、前に定義した関数を呼び出すことができます。

のは、それが実際にどのように機能するかを見てみましょう:両方のテンプレート名を渡すことに

# The layout template 
<title><%= @view_module.title(@view_template, assigns) %></title> 

# In some view module 
def title("show.html", _assigns) do 
    "My awesome page!" 
end 

おかげで、それは正確にrender/2のように動作し、表題の機能に割り当てる - 私たちは、テンプレート名のパターンマッチをすることができますし、へのアクセス権を持っていますすべての割り当て。私たちはすべてのビューで無条件に関数を呼び出すので、すべてのビューで定義する必要があります - function_exported?/3といくつかのデフォルトのフォールバックタイトルで追加のチェックを追加できますが、私は明示的であり、それは多くの作業と単純なコードを作成します。

+0

これはすばらしいアイデアです – Mitkins

+0

これはドキュメントにこれを追加することを検討しています。これは、Railsがテンプレートインクルードの使用に関して多くの進歩を遂げているからです。非常に素晴らしい解決策、他の場所に注意する価値があります。 – PatNowak

+0

専用のプラグはここでは自然ではありませんか?何か不足していますか? – mudasobwa

関連する問題