【Phoenix】2、初始化 Phoenix 项目后的 目录结构

摘要:
因为templates/layout-Eex下的app.html是整个页面的模板。如果我们用自己的模板替换一个句子,我们就可以呈现它。目前,我只了解了这个和其他用法。12.到目前为止,我们已经学会了简单的新路线和简单的渲染。我是一条支线--------------------------------------------------------------------------------我是一个支线13.首先,创建一条新路线。这里我们有一个动态路由,如下所示://:message//在Elixir中:在消息中,它被称为原子,也就是说,键值对是消息的值。然而,在路由中,即如果message=1,则动态路由的路径为/hello/1。

  1、当我们创建的时候,Phoenix 为我们建立的根目录架构,如下:

├── _build
├── assets  // 这个是放一下静态文件的,不如 js、css img 和 node_module 依赖包,都是基本放在这里
├── config  // 是放一些配置的,数据库的配置也基本放在这里
├── deps    // 这里应该是放 Elixir 这个语言的依赖包的
├── lib     // 开发主要在这个目录下进行
│   └── hello
│   └── hello_web
│   └── hello.ex
│   └── hello_web.ex
├── priv   // 这个下面是一些 assets 打包后,存放的文件
├── test   // 这个估计是测试用的文件夹

  2、这篇文章的教程,大部分都是在 lib/hello_web 这个目录下进行,目录结构如下:(页面的路由,控件,模板都是在这个目录下)

├── channels // 这个不清楚
│   └── user_socket.ex
├── controllers // 控制器
│   └── page_controller.ex
├── templates  // 模板放的位置
│   ├── layout
│   │   └── app.html.eex
│   └── page
│       └── index.html.eex
└── views // 渲染页面的模块调用位置
│   ├── error_helpers.ex
│   ├── error_view.ex
│   ├── layout_view.ex
│   └── page_view.ex
├── endpoint.ex
├── gettext.ex
├── router.ex // 这个是路由配置文件

   

  3、静态的 js、css、图片 和 依赖包都在 priv/static 的文件夹中

├── assets
│   ├── css
│   │   └── app.css
│   ├── js
│   │   └── app.js
│   └── static
│   └── node_modules
│   └── vendor

  

  4、在本地运行的文件,不在浏览器上传输的在 lib/hello 中

lib
├── hello
|   ├── application.ex
|   └── repo.ex

  5、在 lib/hello_web/router.ex 文件中,所有的 http 路径请求 控制,会在这里控制,

// 所有类似的路径请求,都会被 PageController 中的 index 方法处理,模块定义 路径在 lib/hello_web/controllers/page_controller.ex
get "/", PageController, :index

  

  6、下面让我们创建一个 http://localhost:4000/hello 路径的页面,我们先在 router.ex 文件中 scope 里面,新增一个 路径为 /hello 的 get 请求,新增后如下:

scope "/", HelloWeb do
  pipe_through :browser

  get "/", PageController, :index
  get "/hello", HelloController, :index
end

  

  7、在 lib/hello_web/controllers 目录下新建一个叫 hello_controller.ex 的文件,内容如下:

defmodule HelloWeb.HelloController do
  use HelloWeb, :controller
  // 这里有两个参数
  // conn 是一个包含大量请求数据的结构
  // params 是请求参数,在这里没有使用,直接 params 会在编译的时候报警告,加上 _ 就可以避免了
  def index(conn, _params) do

    // 这里的意思,是告诉 Phoenix 找到一个 模板叫做 index.html.eex 并且渲染它
    // Ps: 这里我们可以在这里用 atom(原子数据) 作为值,例如:render(conn, :index)
   // 但是 模板 会根据 atom 的值,作为头部,在 index.html / index.json 之间选择
    render(conn, "index.html")
  end
end

  8、然后,官方推荐在 view 中处理数据(这我不确定是不是这样理解),所以在 lib/hello_web/views 下面新建一个 hello_view.ex 的文件,内容如下:

defmodule HelloWeb.HelloView do
  use HelloWeb, :view
end

  9、Phoenix 中的模板,使用的是 EEx(是 Elixir 的嵌入式,允许嵌入 Elixir 代码到 字符串),文件后缀是 .eex;

     模板的作用域是 一个 view,view 的作用域是 controller,我们最好统一命名,所以创建一个命名空间(也就是创建一个 文件夹);这里创建一个 hello 的文件夹,在 templates 文件夹下,然后在 hello 下创建一个 index.html.eex 文件,内容如下:

<div class="phx-hero">
  <h2>第一个 Phoenix 的模板渲染</h2>
</div>

   

  10、mix phx.server 运行 Phoenix 服务(如果你已经运行服务了,直接刷新就好了,Phoenix 已经做了热重载),访问路径 http://localhost:4000/hello,我们可以看到下图:

【Phoenix】2、初始化 Phoenix 项目后的 目录结构第1张

  11、为什么我们只写了一个 简单的 div 标签就看到一整个网页呢?是因为 templates/layout 下面的 app.html.eex 是一整个页面的模板,其中有一句 替换 成我们自己写的模板,就行渲染了。如下:

// 就这一行代码,把我们写的模板替换到这里位置来,进行渲染。暂时只了解到这里,其他的用法之类的。后面学习。
<%= render @view_module, @view_template, assigns %>

【Phoenix】2、初始化 Phoenix 项目后的 目录结构第2张

   12、到这里为止,我们的就算是学会了简单的新增路由,和简单的渲染。

我是分割线-------------------------------------------------------------------------------------我是分割线

  13、先新建一个路由,我们这里是一个动态路由,如下:

// :messager 这个大概都知道是什么了。
// 在 Elixir 中 :messager 中,叫原子,也就是 键值对都是 messager 的值。但在路由中,也就是 messager = 1 的话,动态路由的路径是 /hello/1 了。
get "/hello/:messenger", HelloController, :show

  

  14、新增一个动作,因为我们上面定义的 是 :show ,而不是已经存在的 :index 动作,因为都是 hello 这个路由下,所以我们还在 hello_controller 这个文件中 新增就行了,如下:

  def show(conn, %{"messenger" => messenger}) do
    render(conn, "show.html", messenger: messenger)
  end  

  // 新增后 hello_controller.ex 文件的内容,如下:
  // 这里可能有小白,没空 Elixir 语法就跑过来看了, 我大概讲解一下,
  // defmodule 空间.名称 do 这个,就是 Elixir 定义模块的方法,模块这个,我也只是大概看了一下,说法不一定对
  // def 名称 do 是定义函数的,Elixir 是函数式编程,所以函数式第一公民
  // end 是说明这个模块(或者函数),到这里结束。
  defmodule HelloWeb.HelloController do
    use HelloWeb, :controller

    def index(conn, _params) do
      render(conn, "index.html")
    end

    def show(conn, %{"messenger" => messenger}) do
      render(conn, "show.html", messenger: messenger)
    end
  end

  

  15、如果动态路由。有多个值,如下:

#hello_controller.ex 文件
def show(conn, %{"messenger" => messenger, "test" => test}) do
  render(conn, "show.html", messenger: messenger, test: test)
end

#router.ex 文件
defmodule HelloWeb.Router do
  use HelloWeb, :router

  pipeline :browser do
    plug :accepts, ["html"]
    plug :fetch_session
    plug :fetch_flash
    plug :protect_from_forgery
    plug :put_secure_browser_headers
  end

  pipeline :api do
    plug :accepts, ["json"]
  end

  scope "/", HelloWeb do
    pipe_through :browser

    get "/", PageController, :index

    get "/hello", HelloController, :index

    get "/hello/:messenger/:test", HelloController, :show
  end

  # Other scopes may use custom stacks.
  # scope "/api", HelloWeb do
  #   pipe_through :api
  # end
end

#show.html.eex 文件
// 一个 <%= %> 好像只能嵌入一个 变量
<div class="phx-hero"> <p>Hello World, from <%= @messenger %> 我是测试数据<%= @test %> </p> </div>

免责声明:文章转载自《【Phoenix】2、初始化 Phoenix 项目后的 目录结构》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇日志采集框架Flume以及Flume的安装部署(一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统)Unity扩展编辑器--类型3:Custom Editors下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux-(telnet,wget)

telnet命令 telnet命令通常用来远程登录。telnet程序是基于TELNET协议的远程登录客户端程序。Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序,用它连接到服务器。终端使用者可以在telnet程序中输...

Rsync同步时删除多余文件 [附:删除大量文件方法的效率对比]

日常运维工作中用到rsync同步两个目录时,有时会要求删除目标目录中比源目录多出的文件,这种情况下,可用到rsync的--delete参数来实现。 实例说明:在服务器A上同步/tmp/work目录到远程服务器B的/tmp/work目录下(A和B已经提前做好ssh无密码信任跳转关系了),同时删除B服务器/tmp/work目录下相比于A服务器/tmp/work...

CentOS安装

目前,我们安装Linux操作系统的主要目的是为了更好地了解和学习它。如果条件允许,最好把Linux操作系统安装在一台PC机上;如果条件不允许也没有关系,阿铭会教你使用虚拟机来安装Linux操作系统。 大多数读者朋友比较习惯使用Windows操作系统,所以建议你使用虚拟机来学习Linux。阿铭相信,如果在Windows系统里安装一个虚拟机,然后在虚拟机上安装...

Flask----目录结构

以此结构为例,这个小项目是《Flask Web开发:基于python的web应用开发实战》第一部分结束后的代码框架 第一层 有app、tests、migrations三个文件夹和config.py、manage.py两个py文件以及data-dev.sqlite、data-tests.sqlite两个sqlite数据库   app文件夹下主要写flask...

linux svn服务器搭建、客户端操作、备份与恢复

Subversion(SVN)是一个开源的版本控制系統,管理着随时间改变的数据。这些数据放置在一个中央资料档案库中,这个档案库很像一个普通的文件服务器,它会记住每一次文件的变动,这样就可以把档案恢复到旧的版本,或是浏览文件的变动历史。 本文目录: linux svn服务器部署 linux svn客户端命令操作 linux svn备...

android中的内部存储与外部存储

我们先来考虑这样一个问题: 打开手机设置,选择应用管理,选择任意一个App,然后你会看到两个按钮,一个是清除缓存,另一个是清除数据,那么当我们点击清除缓存的时候清除的是哪里的数据?当我们点击清除数据的时候又是清除的哪里的数据?读完本文相信你会有答案。 在android开发中我们常常听到这样几个概念,内存,内部存储,外部存储,很多人常常将这三个东西搞混,那么...