2016-10-25 55 views
2

我正在閱讀'Programming Phoenix'一書來創建我的第一個MVC簡單路由項目。在本書中,它說創建一個'hello_view.ex',它在MVC的視圖部分下。但模板中已經有了一個視圖。這感覺非常混亂。Phoenix中的hello_view.ex有什麼用處

此外,他們告訴我把hello_world.html放在模板中的'hello'文件夾中。我可以更改此文件夾名稱嗎?爲什麼我不能重命名它?在「hello_controller.ex」,它說:「hello_world.html」,而不是「你好/ hello_world.html」

enter image description here

回答

3

鳳凰意見沒有嵌入式編程語言如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() 

這是HelloHello.PageView或任何名稱是。

EDIT2

關於更改默認視圖控制器(鳳凰文檔信息):

默認情況下,控制器呈現模板具有類似名稱的 到控制器的視圖。例如,MyApp.UserController將在MyApp.UserView內呈現 模板。這些信息可以通過 使用render/3render/4put_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 
+0

太好了!非常感謝。但是,你能告訴我它是如何知道「hello_world.html」在'hello'文件夾內?我看不到任何這樣說的代碼。我已經上傳了該項目的屏幕截圖 –

+0

我更新了我的答案。 – PatNowak

+0

看不到任何更新。你確定? –