鳳凰意見沒有嵌入式編程語言如HTML html.erb
模板,但名稱類似於Django中的那些,其中view
表示用於顯示數據的代碼,並且template
表示具有嵌入式Elixir代碼的實際HTML(並且它們具有擴展eex
)。 據鳳凰框架,有關意見短信息的官方指南:
他們還充當從控制器的原始數據,它準備在模板中使用的表示層。執行這種轉換的函數應該放在視圖中。
檢查了這一點:
Ruby on Rails的流程:
router.rb -> Controller (-> Model) -> view in html.erb
Django的流程:
urls.py -> View (act like Controller) -> Template
鳳凰流量:
endpoint (in lib) -> router (in web) -> Controller -> View -> Template
鳳凰流似乎是更長,但事實並非如此。對你來說最大的好處是:
你對中間件有明確的控制權!
請記住,框架對你來說是神奇的,但明確地說。你完全可以看到所謂的宏和其他東西。
編輯
檢查出在你的代碼中使用use
進口時的東西。
在你的控制器中你使用的是Phoenix.Controller
的東東,它提供了你的render
函數。
您使用conn,template和render
調用參數。在deps/phoenix/lib/phoenix/controller.ex
你必須存儲在此render
功能和私有函數do_render
行:
view = Map.get(conn.private, :phoenix_view) ||
raise "a view module was not specified, set one with put_view/2"
從當前連接獲取您的視圖名稱。
而且幾行以後使用它:
Phoenix.View.render_to_iodata(view, template, Map.put(conn.assigns, :conn, conn))
該呼叫deps/phoenix/lib/phoenix/view.ex
然後render_within
內部render
使用,但該文件夾的名稱在__using__
use Phoenix.Template, Phoenix.View.__template_options__(__MODULE__, unquote(opts))
這就要求__template__options
設置以下行放置:
module
|> Module.split()
|> Enum.take(1)
|> Module.concat()
這是Hello
從Hello.PageView
或任何名稱是。
EDIT2
關於更改默認視圖控制器(鳳凰文檔信息):
默認情況下,控制器呈現模板具有類似名稱的 到控制器的視圖。例如,MyApp.UserController
將在MyApp.UserView
內呈現 模板。這些信息可以通過 使用render/3
,render/4
或put_view/2
功能更改的任何時間:
def show(conn, _params) do
render(conn, MyApp.SpecialView, :show, message: "Hello")
end
def show(conn, _params) do
conn
|> put_view(MyApp.SpecialView)
|> render(:show, message: "Hello")
end
太好了!非常感謝。但是,你能告訴我它是如何知道「hello_world.html」在'hello'文件夾內?我看不到任何這樣說的代碼。我已經上傳了該項目的屏幕截圖 –
我更新了我的答案。 – PatNowak
看不到任何更新。你確定? –