凤凰城的hello_view.ex有什么用?

时间:2016-10-25 12:00:47

标签: elixir phoenix-framework elixir-framework

我正在阅读编程凤凰城'预订创建我的第一个MVC简单路由项目。在书中,它说要创建一个' hello_view.ex',它在MVC的视图部分下。但是模板中已有一个视图。这感觉很混乱。

另外,他们告诉我把hello_world.html放在'你好'模板中的文件夹。我可以更改此文件夹名称吗?为什么我不能重命名呢?在' hello_controller.ex'中,它表示' hello_world.html',而不是' hello / hello_world.html'

enter image description here

1 个答案:

答案 0 :(得分:3)

Phoenix视图不是具有嵌入式编程语言的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,模板和分配参数调用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))

此致电使用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的{​​{1}}或任何名称。

EDIT2

关于更改控制器中的默认视图(来自Phoenix文档的信息):

  

默认情况下,控制器在具有类似名称的视图中呈现模板   到控制器。例如,Hello.PageView将呈现   MyApp.UserController内的模板。这些信息可以   使用MyApp.UserViewrender/3render/4随时更改   功能:

put_view/2