我正在阅读编程凤凰城'预订创建我的第一个MVC简单路由项目。在书中,它说要创建一个' hello_view.ex',它在MVC的视图部分下。但是模板中已有一个视图。这感觉很混乱。
另外,他们告诉我把hello_world.html放在'你好'模板中的文件夹。我可以更改此文件夹名称吗?为什么我不能重命名呢?在' hello_controller.ex'中,它表示' hello_world.html',而不是' hello / hello_world.html'
答案 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}}或任何名称。
关于更改控制器中的默认视图(来自Phoenix文档的信息):
默认情况下,控制器在具有类似名称的视图中呈现模板 到控制器。例如,
Hello.PageView
将呈现MyApp.UserController
内的模板。这些信息可以 使用MyApp.UserView
,render/3
或render/4
随时更改 功能:
put_view/2