web-dev-qa-db-ja.com

フェニックス:他のフォルダのレンダリングテンプレート

Web/templatesフォルダーに2つのテンプレートフォルダーがあります。

> ls web/templates
personal_info       user

私が欲しいのは、personal_infoの別のビューのuserフォルダーからいくつかのテンプレートをレンダリングすることです。パスにファイルがあります:web/templates/personal_info/index.html.eex、次のコンテンツがあります:

<%= render "user/xyz.html" %>

しかし、次のエラーが発生します。

[error] #PID<0.821.0> running MyApp.Endpoint terminated
Server: localhost:4000 (http)
Request: GET /
** (exit) an exception was raised:
    ** (Phoenix.Template.UndefinedError) Could not render "user/xyz.html" for MyApp.PersonalInfoView, please define a matching clause for render/1 or define a template at "web/templates/personal_info". The following templates were compiled:

* index.html

他のフォルダーで定義されたテンプレートをレンダリングする方法を教えてください。いくつかの順列を試しましたが、どれも機能しませんでした。

21
Saurabh

フェニックステンプレートは単なる関数なので、UserViewの「xyz.html」テンプレートをPersonalInfoのビューからレンダリングする場合は、関数を呼び出すだけです。

web/templates/personal_info/show.html.eexテンプレート内にいるとしましょう。 (Phoenix.View.renderはすでにインポートされています):

<%= render UserView, "xyz.html", user: user %>

すべてのテンプレートを渡したい場合は、PersonalInfoテンプレートが提供されていることを割り当てます。

<%= render UserView, "xyz.html", assigns %>

ご存知のように、テンプレートは単なる関数であるため、これはどこからでも機能します。たとえば、同じことがiexでも機能します。

iex> Phoenix.View.render(MyApp.UserView, "xyz.html")
"<h1>User ..."
33
Chris McCord

私はPhoenix1.3.0を使用しています。追加しなければならなかったようです

alias MyApp.Userview

to web/views/personal_info_view.ex、次に

<%= render conn, UserView, "xyz.html" %>

上記のエイリアスがない場合は、

<%= render conn, MyApp.UserView, "xyz.html" %>    
1
owyongsk

私にとっては、アプリケーション名を指定したときに機能しました。

web/templates/product_gallery/index.html.eex:

<p>Please, render me!</p>

web/templates/kitchen/index.html.eex:

<%= render APP.ProductGalleryView, "index.html", assigns %>

アプリケーション名なしでレンダリングしようとすると、次のようになります。

undefined function ProductGalleryView.render/2 (module ProductGalleryView is not available)
1
Denis

どうやら以下が働いた:

<%=  Phoenix.View.render(MyApp.UserView, "xyz.html") %>

より良い代替案がある場合は、私に知らせてください。

出典: this

1
Saurabh