Rails 布局和视图渲染 from RailsGuides
来源:互联网 发布:php会员订单系统源码 编辑:程序博客网 时间:2024/06/05 10:34
从控制器的角度来看,创建 HTTP 响应有三种方法:
1.调用 render 方法,向浏览器发送一个完整的响应;
2.调用 redirect_to 方法,向浏览器发送一个 HTTP 重定向状态码;
3.调用 head 方法,向浏览器发送只含报头的响应;
默认情况下,Rails 渲染得到的结果内容类型为 text/html;如果使用 :json 选项,内容类型为 application/json;如果使用 :xml 选项,内容类型为 application/xml。
文件的扩展名决定了要使用哪个模板处理程序。从 Rails 2 开始,ERB 模板(含有嵌入式 Ruby 代码的 HTML)的标准扩展名是 .erb,Builder 模板(XML 生成器)的标准扩展名是 .builder。
真正处理渲染过程的是 ActionView::TemplateHandlers 的子类
render_to_string 和 render 的用法完全一样,不过不会把响应发送给浏览器,而是直接返回字符串。
render 方法最简单的用法是什么也不渲染:
render nothing: true 响应的主体是空的,但请求本身是成功的,因为 Rails 把响应码设为了“200 OK”。调用 render 方法时可以设置 :status 选项修改状态码。这种用法可在 Ajax 请求中使用,因为此时只需告知浏览器请求已经完成。
默认情况下,渲染文件时不会使用当前程序的布局。如果想让 Rails 把文件套入布局,要指定 layout: true 选项。
渲染其他控制器中的动作模板
render template: "products/show"
渲染任意文件
render file: "/u/apps/warehouse_app/current/app/views/products/show"
使用 render 方法的 :inline 选项 ,可以使用 :type 选项指定使用其他处理程序
render inline: "xml.p {'Horrid coding practice!'}", type: :builder
使用 :inline 选项指定了 ERB 代码,render 方法就不会渲染视图
render inline: "<% products.each do |p| %><p><%= p.name %></p><% end %>"
render plain: "OK" //渲染纯文本主要用于 Ajax 或无需使用 HTML 的网络服务。
render html: "<strong>Not Found</strong>".html_safe
render json: @product
render xml: @product
render js: "alert('Hello Rails');"
render body: "raw" //render 方法时使用 :body 选项,可以不设置内容类型,把原始的内容发送给浏览器,只有不在意内容类型时才可使用这个选项。大多数时候,使用 :plain 或 :html 选项更合适。'
响应 HTTP 请求的另一种方法是使用 redirect_to,render 告诉 Rails 构建响应时使用哪个视图(以及其他静态资源)。redirect_to 做的事情则完全不同:告诉浏览器向另一个地址发起新请求。例如,在程序中的任何地方使用下面的代码都可以重定向到 photos 控制器的 index 动作:redirect_to photos_url
redirect_to :back //特殊的重定向,返回到前一个页面
调用 redirect_to 方法时,Rails 会把 HTTP 状态码设为 302,即临时重定向。如果想使用其他的状态码,例如 301(永久重定向),可以设置 :status 选项:redirect_to photos_path, status: 301
执行到 redirect_to 方法时,代码会停止运行,等待浏览器发起新请求。你需要告诉浏览器下一个请求是什么,并返回 302 状态码。
ender :action 不会执行目标动作中的任何代码,因此不会创建 index 视图所需的 @books 变量。修正方法之一是不渲染,使用重定向:
def index
@books = Book.all
end
def show
@book = Book.find_by(id: params[:id])
if @book.nil?
redirect_to action: :index
end
end
若是render action: "index" 不会执行目标动作中的任何代码,因此不会创建 index 视图所需的 @books 变量。修正方法之一是不渲染,使用重定向。即上面的redirect_to
静态资源标签帮助方法
auto_discovery_link_tag
javascript_include_tag
stylesheet_link_tag
image_tag
video_tag
audio_tag
<%= image_tag "header.png" %> 注意,必须指定图片的扩展名。
1.调用 render 方法,向浏览器发送一个完整的响应;
2.调用 redirect_to 方法,向浏览器发送一个 HTTP 重定向状态码;
3.调用 head 方法,向浏览器发送只含报头的响应;
默认情况下,Rails 渲染得到的结果内容类型为 text/html;如果使用 :json 选项,内容类型为 application/json;如果使用 :xml 选项,内容类型为 application/xml。
文件的扩展名决定了要使用哪个模板处理程序。从 Rails 2 开始,ERB 模板(含有嵌入式 Ruby 代码的 HTML)的标准扩展名是 .erb,Builder 模板(XML 生成器)的标准扩展名是 .builder。
真正处理渲染过程的是 ActionView::TemplateHandlers 的子类
render_to_string 和 render 的用法完全一样,不过不会把响应发送给浏览器,而是直接返回字符串。
render 方法最简单的用法是什么也不渲染:
render nothing: true 响应的主体是空的,但请求本身是成功的,因为 Rails 把响应码设为了“200 OK”。调用 render 方法时可以设置 :status 选项修改状态码。这种用法可在 Ajax 请求中使用,因为此时只需告知浏览器请求已经完成。
默认情况下,渲染文件时不会使用当前程序的布局。如果想让 Rails 把文件套入布局,要指定 layout: true 选项。
渲染其他控制器中的动作模板
render template: "products/show"
渲染任意文件
render file: "/u/apps/warehouse_app/current/app/views/products/show"
使用 render 方法的 :inline 选项 ,可以使用 :type 选项指定使用其他处理程序
render inline: "xml.p {'Horrid coding practice!'}", type: :builder
使用 :inline 选项指定了 ERB 代码,render 方法就不会渲染视图
render inline: "<% products.each do |p| %><p><%= p.name %></p><% end %>"
render plain: "OK" //渲染纯文本主要用于 Ajax 或无需使用 HTML 的网络服务。
render html: "<strong>Not Found</strong>".html_safe
render json: @product
render xml: @product
render js: "alert('Hello Rails');"
render body: "raw" //render 方法时使用 :body 选项,可以不设置内容类型,把原始的内容发送给浏览器,只有不在意内容类型时才可使用这个选项。大多数时候,使用 :plain 或 :html 选项更合适。'
响应 HTTP 请求的另一种方法是使用 redirect_to,render 告诉 Rails 构建响应时使用哪个视图(以及其他静态资源)。redirect_to 做的事情则完全不同:告诉浏览器向另一个地址发起新请求。例如,在程序中的任何地方使用下面的代码都可以重定向到 photos 控制器的 index 动作:redirect_to photos_url
redirect_to :back //特殊的重定向,返回到前一个页面
调用 redirect_to 方法时,Rails 会把 HTTP 状态码设为 302,即临时重定向。如果想使用其他的状态码,例如 301(永久重定向),可以设置 :status 选项:redirect_to photos_path, status: 301
执行到 redirect_to 方法时,代码会停止运行,等待浏览器发起新请求。你需要告诉浏览器下一个请求是什么,并返回 302 状态码。
ender :action 不会执行目标动作中的任何代码,因此不会创建 index 视图所需的 @books 变量。修正方法之一是不渲染,使用重定向:
def index
@books = Book.all
end
def show
@book = Book.find_by(id: params[:id])
if @book.nil?
redirect_to action: :index
end
end
若是render action: "index" 不会执行目标动作中的任何代码,因此不会创建 index 视图所需的 @books 变量。修正方法之一是不渲染,使用重定向。即上面的redirect_to
静态资源标签帮助方法
auto_discovery_link_tag
javascript_include_tag
stylesheet_link_tag
image_tag
video_tag
audio_tag
<%= image_tag "header.png" %> 注意,必须指定图片的扩展名。
0 0
- Rails 布局和视图渲染 from RailsGuides
- Rails 布局和视图渲染
- Ruby On Rails--Layouts and Rendering in Rails(布局和页面渲染)
- rails代码重构之 视图层的渲染问题
- ios 视图渲染架构和原理
- ios 视图渲染架构和原理
- 视图渲染
- 【浏览器渲染原理】布局之全局布局和增量布局
- 【浏览器渲染原理】布局之异步布局和同步布局
- rails视图层
- Zend Framework布局和视图 Layouts views
- Zend Framework布局和视图 Layouts views
- 关于rails的模板渲染
- ArcEngine 实现数据视图和布局视图同步
- 视图渲染详解2
- Yii 视图渲染过程
- 第一节 视图与渲染
- 渲染web视图
- 黑马程序员_集合框架Collection
- SQL语句中的limit使用方法
- Javascript事件实例详解
- Java中有两种实现多线程的方式以及两种方式之间的区别
- 华为离职副总裁给任正非的辞职信【受益很多】
- Rails 布局和视图渲染 from RailsGuides
- session同ip不同端口的多个网站session冲突的解决办法
- 基础练习 字母图形
- C++父类子类转化及函数调用
- 光照渲染模型
- VS检测内存泄漏,定位泄漏代码位置方法
- CSS样式表初始化代码
- 修改JAVA_HOME无效,java版本保持不变的问题解决
- 多屏时代的一个不错的选择