render的用法
在 controller 中的用法
在 controller 中用 render
的作用是生成 HTTP Reponse。
在 controller 中,每当执行完一个 action 之后,如果没有定义指向,Rails 会自动到 view 中去找跟该 action 同名的一个模板,比如 index
action 就会对应 index.html.erb
模板。
但不是每一个 action 都会有一个相应的模板页面,比如说 create
这个 action,实际上用来创建数据,并没有一个 create.html.erb
的模板在 view 里,所有在 controller 里就需要做一个指向,让 Rails 执行完毕之后,返回一个页面。常用的做法是,当 create
执行成功,就会 redirect_to
到 index
页面;如果 create
不成功,就回到 nes
页面,这时我们一般用 render :new
,让用户重新填写表单。
在controller 中, render
后面接的可以是 action,比如说
render action: :new
也可以有更多的用法,比如
render text: 'ok'
render json: @users
render xml: @users
render file: 'app/views/users/index'
render partial: 'app/views/users/search'
在同一个 controller 里,只能有一个 render
或者 一个 redirect_to
的请求,否则会发生异常。
在 view 中的用法
在 view 中使用 render
的时候,通常是用作渲染某个视图。
需要注意到的时候,如果是把一个循环中的代码做成一个 partial
,在 render
的时候,需要把相关的变量传递到 partial
里面去,可以使用 locals:
。
<% @users.each do |user| %>
<%= render partial: "one_user", locals: { user: user} %>
<% end -%>
像上述的例子,是在遍历输出,rails 对于这种情况还有专门的一个方法,就是 collection
,可以写成这样
<%= render partial: "one_user", collection: @users, as: :user %>
假如 @users
有 10条数据,用第一种方法,就会对 one_user
这个 partial 请求 10 次;但如果用第二种方法,就只需要请求一次,效率是更高的。