一、心得体会
1、今天主要完成了什么?
- 花了5个小时看了Rails guide 4的视图和Controller部分
- 2个小时看代码
- 1小时试题
2、今天主要的收获是什么?
- Rails的视图很多标签需要熟悉
- 原来这就是Rails全栈
- controller的过滤器
3、今天的状态如何?
昨天睡的晚,今天竟然状态还不错,就是中午的时候,太困了,睡了一会
4、今天的犯了哪些错误?
5、还剩什么工作需要完成?
明天把今天做的题目再好好做一遍
二、读书笔记
View
- 模板、局部视图和布局的最佳使用方法
- View提供了哪些帮助方法,如何自己编写帮助方法?
- 如何使用本地化视图
- 如何在Rails之外的程序中使用Action View
View和COntrolller是Pack的两个主要组件
模板、视图和布局
什么是ERB?什么是Build::XmlMarkup?
Rails支持多种模板系统,通过文件扩展名加以区分。
在ERB中,可以使用<% %>和<%= %>标签引入Ruby代码。<% %>标签用来执行Ruby代码,没有返回值,例如条件判断、循环或代码块。<%= %>用来输出结果。
例如下面的代码,循环遍历名字:
Builder
适合生成XML文档,在扩展名为.builder的模板中,可以直接使用名xml的XmlMarkup对象。
模板缓存
默认情况下,Rails会把各个模板都编译成一个方法,这样才能渲染视图。开发环境中,修改模板文件后,Rails会检查文件的修改时间,然后重新编译。
AS和object选项
默认情况下,ActiveView::Partials::PartialRanderer对象存在一个本地变量中,变量名和模板名相同,所以,如果有以下代码:
as选项可以为这个本地变量指定一个不同的名字。例如,如果想用item代替product,可以这么做:
<%= render partial: "product", as: "item" %>
object选项可以直接指定要在局部视图中使用的对象。如果模板中的对象在其他地方(例如,在其他实例变量或本地变量中),可以使用这个选项使用。
<%= render partial: "product", object: @item %>
代替
<%= render partial: "product", locals: {product: @item} %>
object和as选项还可同时使用:
渲染集合
在模板中经常需要遍历集合,使用子模板渲染各元素,这种需求可使用一个方法实现,把数组传入该方法,然后使用局部视图渲染各元素。
例如下面这个例子,渲染所有产品:
间隔模板
视图路径
Action View提供的帮助方法简洁。
RecordTagHelper
这个模块提供的帮助方法用来生成记录的容器标签,例如div,渲染Active Record对象时。
BenchmarkHelper
banchmark
这个方法可以计算模板中某个代码块的执行时间,然后把结果写入日志,可以耗时的操作或瓶颈操作放入benchmark代码块中。
CacheHelper
cache
这个方法缓存视图片段,而不是整个动作或页面。
常用来缓存目录,新话题列表,静态HTML片段等,此方法接受一个代码块。
FormHelper
Rails布局和视图渲染
- 如何使用Rails内建的各种渲染方法;
- 如何穿件多个内容区域的布局
- 如何使用局部视图去除重复
- 如何使用嵌套布局
概览:各组件之间的协作
创建响应:
从控制器的角度看,创建HTTP响应有三种方法:
- 调用render方法,向浏览器发送一个完整的响应;
-调用redirect_to方法,向浏览器发送一个HTTP重定向状态码。
- 调用head方法,向浏览器发送只含报头的响应。
渲染视图
Render方法,大多数情况ActionController::Base#render方法都能满足需求,而且还有多种定制方式,可以渲染Rails模板的默认视图、指定的模板、文件、行间代码或者什么也不渲染。
渲染的内容格式可以是文本,JSON或XML。而且还可以设置响应的内容类型和HTTP状态码。
渲染JSOn
render json: @product
渲染XML
Rails xml: @product
渲染普通的JavaScript
Rails能渲染普通的JavaScript:
render js: "alert('Hello Rails')"
这种方法会把MIME设为text/javascript,再把指定的字符串发给浏览器。
渲染原始的主体
调用render方法时使用:body选项,可以不设置内容类型。
把原始的内容发送给浏览器:
render body: "raw"
render 方法一般可接受四个选项:
- :content_type
- :layout
- :location
- :status
默认情况下,Rails渲染得到的结果内容类型为text/html,如果使用:json选项,内容类型为application/json;如果使用:xml选项,内容类型为application/xml。如果需要修改内容类型,可使用:content_type选项。
render file: filename, content_type: "application/rss"
查找布局
查找布局时,Rails首先查看app/views/layouts文件夹中是否有控制器同名的文件,例如,渲染PhotosController控制器中的动作会使用app/views/layouts/photos.html.erb。
指定控制器所用布局
在控制器中使用layouts方法,可以改写默认使用的布局约定。例如:
运行时选择布局
可以使用一个Symbol,在处理请求时选择布局:
条件布局
如果当前用户是特殊用户,会使用一个特殊布局渲染产品视图。
还可使用行间方法,例如Proc,决定使用哪个布局。如果使用Proc,其代码块可以访问controller实例,这样就能根据当前请求决定使用哪个布局:
条件布局
在控制器中指定布局时可以使用:only和:except选项,这两个选项的值可以是一个方法或一个方法名数组,这些方法都是控制器中的动作:
布局继承
避免双重渲染错误
大多数Rails开发者迟早都会看到一个错误消息
使用redirect_to方法
设置不同的重定向状态码
调用redirect_to
render和redirect_to的区别
render不会自行目标动作中的任何代码
redirect_to 重定向,向浏览器访问/books/,浏览器收到指令后,向控制器的index动作发起请求,控制器从数据库中取出所有图书,渲染index模板,将其返回浏览器,在屏幕上显示所有图书。
在小型程序中,额外增加的时间不是个问题,如果响应时间很重要,这个问题就值得关注了。
使用head构建只返回报头的响应
head方法可以只把报头发给浏览器,还可使用意图更明确的render :nothing达到同样的目的。head方法的参数是HTTP状态码的符号形式。
布局的结构
静态资源标签帮助方法
使用image_tag链接图片
使用video_tag链接视频
video_tag帮助方法为指定的文件生成HTML5<video>标签。
<%= video_tag "movie.ogg" %>
理解yield
在布局中,yield表明一个区域,渲染的视图会插入这里,最简单的情况是只有一个yield,此时渲染的整个视图都会插入整个区域:
还可以这样表示:
<html>
<head>>%= yield %></head>
<body><%= yield %></body>
</html>
视图的主体会插入未命名的yield区域,要想在具名yield区域插入内容,得使用content_for方法。
使用content_for方法
content_for方法在布局的具名yield区域插入内容,例如,下面的视图会在前一节的布局中插入内容:
使用局部视图
把表单绑定到对象上
虽然上述用法很方便,但却不是最好的使用方式。
Action Controller
- 请求如何进入控制器
- 如何限制传入控制器的参数
- 为什么以及如何把数据储存在会话或cookie中
- 处理请求时,如何使用过滤器执行代码
- 如何使用Action Controller内建的HTTP身份认证功能
- 如何把数据流直发用户的浏览器
- 如何过滤敏感信息,不写入程序的日志
- 如何处理请求过程中可能出现的异常
控制器命名约定
Rails控制器的命名习惯是,最后一个单词使用复数形式,但也是有例外,比如ApplicationController。例如:用ClientsController,而不是ClientController;用SiteAdminsController,而不是SiteAdminController或SitesAdminsController
方法和动作
控制器是一个类,继承自ApplicationController,和其他类一样,定义了很多方法,程序接到请求时,路由决定运行哪个控制器和哪个动作,然后创建该控制器的实例,运行和动作同名的方法。
参数
在控制器的动作中,往往需要获取用户发送的数据,或其他参数,在网页程序中参数分为两类,第一类随URL发送,叫做“请求参数”,即URL?符号后面的部分,第二类经常成为“POST”数据。
此时,params[:ids]的值是['1', '2', '3']。注意,参数的值始终是字符串,Rails不会尝试转换类型。
JSON参数
路由参数
健壮参数
嵌套参数
不用健壮参数
会话
Flash消息
cookies
渲染XML和JSON数据
class UsersController < ApplicationController
def index
@uses = User.all
respond_to do |format|
format.html
format.xml { render xml: @users }
format.json { render json: @users }
end
end
end
过滤器(filter)
过滤器(filter)是一些方法,在控制器动作之前、之后,或者前后运行。
过滤器会继承,如果applicationController中定义了过滤器,那么程序的每个控制器都可使用。
后置过滤器和环绕过滤器
过滤器的其他用法
防止请求伪造
request和respond对象
HTTP身份认证
- 基本身份认证
- HTTP摘要身份认证
数据流和文件下载
发送文件
使用REST的方式下载文件
任意数据的实时流
过滤日志
异常处理
强制使用HTTPS协议