render的意思就是渲染,渲染视图.在浏览器的request之后作出相应的response,然后把相应的视图渲染到此视图中.他的主要作用范围有两个:在controller中和在views中使用.
1.在controller中
修改action查找view的行为,使想要呈现的视图显示出来.如
def new
end
def create
@user = User.find_by(username: params[:username],password: params[:password])
if @user
session[:user_id] = @user.id
flash[:notice] = "登录成功"
redirect_to root_path
else
flash[:notice] = "用户名或密码不正确"
render action: :new
end
end
#此代码的作用是如果用户名或密码不正确,重新渲染此页面并显示错误信息
render后可以跟的行为有很多:如
render text: 'ok'
render json: @users
render xml: @users
render file: 'app/views/users/index'
render partial: 'app/views/users/search'
Pay attention
一个action只能执行一次render或redirect_to
def search
if @user
render json :@user
return #如果此处不加return相当与执行了两次render会出现异常
end
render text: "OK"
end
2.在views中
可以渲染子视图,并且能够访问当前view或者action的所有实例变量.
# app/views/users/index.html.erb
# app/views/shared/_menu.html.erb
<%= render "shared/menu" %>
# 这样就可以渲染出/app/views/shared/_menu.html.erb中的视图
<h1>Products</h1>
<p>Here are a few of our users:</p>
...
render同样可以传递参数:
<% @user.each do |user| %>
<%= render partial: "one_user", locals: {user: user} %>
# locals中可以看作key-value的形式,把当前each中的参数user传到partial中的user中
<% end -%>
# or
<%= render "one_user", collection: @users, as: :user %>
#或者直接把@users实例直接传递给partial中的user