rails中render的用法总结

##视图中使用render取得局部视图等
render(options = {}, locals = {}, $block)
options参数取值包括

:partial
:file
:inline
:text
:plain
:html
:body

####:partial用法

#####基本用法

<%= render partial: “account” %>
引入局部视图_account.html.erb,不传入变量
如果需要传入变量,可以使用locals参数

<%= render partial: "account", locals: { account: @buyer } %>

这句代码会将@buyer变量传入局部视图_account.html.erb的account本地变量
亦可使用object参数

<%= render partial: "account", object: @buyer %>

这句代码会将@buyer变量传入局部视图,赋予局部视图同名的本地变量,即account
如果需要使用不同于局部视图名称的本地变量,可以使用as配合object

<%= render partial: "account", object: @buyer, as: 'user' %>

这句代码会将@buyer变量传入局部视图的user本地变量中,与下面的代码作用相同

<%= render partial: "account", locals: { user: @buyer } %>

#####传入集合

<%= render partial: "ad", collection: @advertisements %>

@advertisements 是一个集合元素,这句代码会迭代该集合元素,使用集合内每个元素对局部视图_ad.html.erb进行渲染,并将集合内元素传入局部视图中的ad本地变量,同时自动生成一个计数器,名为 ad_counter
如果需要不同于局部视图名称的本地变量,可以使用as配合,用法同上
如果需要在每个局部视图渲染的中间插入其他视图,可以使用spacer_template

<%= render partial: "ad", collection: @advertisements, spacer_template: "ad\_divider" %>

这句代码会在每次渲染局部视图_ad后插入一个_ad_divider.html.erb的局部视图,进行分割

<%= render(partial: "ad", collection: @advertisements) || "There's no ad to be displayed" %>

注意代码的后半句,这样做当集合元素为空时,不会返回nil,而是显示引号内的内容。

#####to_partial_path
@account.to_partial_path 会返回’accounts/account’,所以下面的代码

<%= render partial: @account %>

等同于

<%= render partial: 'accounts/account', locals: { account: @account } %>

如果不使用layouts或collections等参数,而只使用partial,则partial可以省略,如下

<%= render "account" %>   #等同于<%= render partial: "account" %>
<%= render "account", account: @buyer %> #等同于<%= render partial: "account", locals: { account: @buyer } %>
<%= render @account %> #等同于<%= render partial: "accounts/account", locals: { account: @account } %>
<%= render @posts %> #等同于<%= render partial: "posts/post", collection: @posts %>

#####layouts
layouts参数指定渲染局部视图时使用的布局

#####:file 渲染一个具体的模板文件,可以使用:locals传入变量

#####:inline 渲染行间代码

#####:text 渲染一段text内容

#####:plain 渲染一段text内容,将content type设置为text/plain

#####:html 渲染html字符串

#####:body 渲染原始内容,不设置内容类型

##在控制器中使用render
在控制器的具体动作中使用render

render nothing: true

什么都不渲染,一般不这么用,使用head方法更好

render "edit"
render :edit
render "products/show" #渲染不同控制器下的动作
render "/path/to/app/views/products/show" #渲染任意文件

如上是常用的render渲染方法,另外还可渲染行间代码和html内容等(和前述相同)
render可以接受四个选项

:content_type  #渲染的结果类型
:layout  #使用的布局 false为不使用
:location  #设置HTTP Location报头
:status  # 设置响应的状态码

##render与redirect_to的区别
render告诉Rails构建响应时使用哪个视图(以及其他静态资源)。
redirect_to告诉浏览器向另一个地址发起新请求。
render :action不会执行目标动作中的任何代码,仅仅渲染模板