View 的基本概念和用法
View 在 MVC 中, 一直是最简单的概念. 大家要分分钟入门.
视图在 Rails 中, 就是.html.erb
文件. 我们原则上把跟 HTML 有关的东西, 都写在视图中。
每个视图都要由 controller 触发. 所有的视图文件, 都放在: app/views/ 目录下. 例如: app/views/books/new.html.erb
这是 Rails 的约定。
最基本用法
下面是一个最简单的 erb 文件:
<p>当前时间是: <%= Time.now %></p>
它会直接被转换成下面的 HTML:
<p>当前时间: 2016-10-08 21:01:35 +0800</p>
<% %> 与 <%= %> 的区别
<% %> 表示仅运行代码, 例如: <% a = 1 %>
<%= %> 表示, 不但运行, 而且把结果渲染到 html 中. 例如: <%= Time.now %>
Rails 中的视图在什么时候被渲染?
用一个例子来说明, view 在哪里建立, 在什么时候渲染:
-
小王同学在浏览器端,输入了一个网址: https://www.explorexd.com ,回车。(这会产生一个 “http request” , 请求方式是 GET)
-
“http request” 从浏览器,发送到服务器端 (www.explorexd.com) 之后, Rails 就会 把这个请求交给 router 来处理。
-
router 根据配置文件: config/routes.rb 中的配置:
Rails.application.routes.draw do resources :fruits # 根据这个路由配置 end
把这个 request,分发到: fruits controller 中的 new action
-
new action 做一些 处理, 显示对应的 erb
# 下面是 app/controllers/fruits_controller.rb 的内容:
class FruitsController < ApplicationController
def new
@hello = 'hellow, Rails!'
# 啥也不写,就直接渲染对应的 erb页面:
# app/views/fruits/new.html.erb
end
end
上面的 new action 执行完, 会自动渲染 new.html.erb
这个文件 ( 文件路径: app/views/books/new.html.erb
)
<% [1,2,3].each do e %>
<%= e %> <br/>
<% end %>
上面的视图文件会被渲染成:
1 <br/> 2<br/> 3<br/>
基本概念讲完了, 就是这么简单.
恰当的使用 @变量
大家记得, 任何实例变量 (@name 这样的), 都用于定义在 controller 中, 然后在 view 中被调用.
Partial (片段)
有时候,如果某个 erb 文件, 过于复杂了。 例如: 20 行。
或者, 某些代码可以重用。
我们就用 Partial 来简化我们的代码, 提取出公共的部分.
不带参数的 partial
例如:
<!-- 下面这段是版权声明,多个页面都需要重用 -->
<footer>
copyright@2016 xx.co.ltd
</footer>
那么就把它写成一个 partial ( 片段)
全名是: app/views/fruits/_footer.html.erb
(注意,文件名以 “_“开头)
然后,我们就可以在对应的 erb 文件中:
<%= render :partial => 'footer' %>
注意: 上面的调用中, 直接使用了 'footer', 而不是 _footer.html.erb。这也是 Rails 的惯例.
带参数的 partial
如果,某个 partial , 是需要参数的,(例如: 年份是个变量)
<!-- 下面这段是版权声明,多个页面都需要重用 -->
<footer>
copyright@ <%= year %>xx.co.ltd
</footer>
那么,在调用时,就:
<%= render :partial => 'footer', :locals => {:year => 2016} %>
可以看到, 使用了 locals 来传递参数.
不要使用嵌套层次过多的 partial
例如 partial A 嵌套 partial B , partial B 嵌套 partial C. 一旦发展下去, 你就会发现自己的代码乱套了。
partial 失去了它简化代码的作用。
helper 的用法
helper 的目的是为了让 view 的代码看起来更简化.
它是一个 ruby module, 可以定义在 app/helpers 目录下的任何文件中. 例如:
# app/helpers/application_helper.rb
module ApplicationHelper
end
添加一个helper
module ApplicationHelper
def say_hi name
"hi #{name}"
end
end
那么我就可以在 任意的 view 中, 使用这个方法:
<%= say_hi "Jim" %>
我在任意的页面中, 可以调用定义在任意 helper 中的方法. 例如:
# app/helpers/foo_helper.rb
module FooHelper
def say_hi
"hi"
end
end
不要过多的使用 helper
因为我们调用 helper 的时候, 不会显示的写出 caller. 例如:
# my_module 就是 say_hi 的caller
my_module.say_hi
# 下面,没有一个显式的caller, 那么,我们就不知道这个find_me方法定义在哪里.
find_me
评论区