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" %> 注意,必须指定图片的扩展名。













0 0
原创粉丝点击