Render 小结

by 小赓赓。 at almost 8 years ago, last updated at almost 8 years ago
W

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