2016-10-25 7 views
2

Я читал книгу «Программирование Феникса», чтобы создать свой первый проект MVC простой маршрутизации. В книге говорится о создании «hello_view.ex», и он находится в разделе просмотра в MVC. Но в шаблонах уже есть представление. Это очень запутанно.Какая польза от hello_view.ex в Phoenix

Кроме того, они сказали мне добавить hello_world.html в папку «hello» в шаблонах. Могу ли я изменить имя этой папки? Почему я не могу переименовать его? В 'hello_controller.ex', он говорит: 'hello_world.html', а не 'привет/hello_world.html'

enter image description here

ответ

3

Phoenix мнение не HTML шаблонов со встроенным языком программирования, как html.erb, но и имена аналогичные тем, которые находятся в Django, где view означает код для отображения данных и template означает фактический HTML со встроенным кодом Elixir (и у них есть расширение eex). Согласно официальному руководству для Phoenix Framework, краткой информации о просмотрах:

Они также выступают в качестве презентационного слоя для необработанных данных от контроллера, подготавливая его для использования в качестве шаблона. Функции, которые выполняют это преобразование, должны идти в поле зрения.

Проверьте это:

Рубин на Rails потока:

router.rb -> Controller (-> Model) -> view in html.erb

Джанго потока:

urls.py -> View (act like Controller) -> Template

Феникс потока:

endpoint (in lib) -> router (in web) -> Controller -> View -> Template

Поток Феникса кажется длинным, но это не так. Самое большое преимущество для вас:

У вас есть явный контроль над промежуточным программным обеспечением!

Помните, что-framework делает магию для вас, но явно. Вы точно видите, какие макросы и другие вещи называются.

Редактировать

Заканчивать материал, который импортируется при использовании use в вашем коде.

В вашем контроллере вы используете Phoenix.Controller материал, который предоставляет вам функцию render.

Вы вызываете render с шаблоном conn и присваиваете параметры. В 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)) 

Этот вызов использует внутренне render в deps/phoenix/lib/phoenix/view.ex , а затем render_within, но имя папки устанавливается в __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

Об изменении режима отображения по умолчанию в контроллере (информация от Phoenix документации):

По умолчанию контроллеры делают шаблоны в представлении с похожим именем к контроллеру. Например, 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 
+0

Отлично! Большое спасибо. Но можете ли вы сказать мне, как он знает, что «hello_world.html» находится в папке «hello»? Я не видел никакого кода, который так и есть. Я загрузил снимок экрана проекта –

+0

Я обновил свой ответ. – PatNowak

+0

ничего не видел. Ты уверен? –

 Смежные вопросы

  • Нет связанных вопросов^_^