Day19 心得体会&读书笔记

一、心得体会
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协议

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,718评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,683评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,207评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,755评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,862评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,050评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,136评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,882评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,330评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,651评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,789评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,477评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,135评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,864评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,099评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,598评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,697评论 2 351

推荐阅读更多精彩内容