Rails 请问 render 和 redirct_to 的主要区别

Sunnyroger · 2012年11月01日 · 最后由 zengfengbo 回复于 2016年12月12日 · 5368 次阅读

看rails guides,不太懂

def index
  @books = Book.all
end

def show
  @book = Book.find_by_id(params[:id])
  if @book.nil?
    redirect_to :action => :index
  end
end

把代码中的redirct_to换成render会怎样 为什么改成 render "index", :alert => 'Your book was not found!' 就是比较好的代码

共收到 13 条回复

一个是渲染模板,一个是跳转到另一个网址,两者根本就没有共同点

#1楼 @gaicitadie 那guides上的那段解释说render只是渲染模版不运行任何代码,那上面的那段代码应该使用的是redirct_to,为什么后面改成了说render "index", :alert => 'Your book was not found!'就是比较好的代码

redirect_to :action => :index需要跳转到index这个action,然后渲染index.html.erb,额外增加了一次http请求。直接render "index", :alert => 'Your book was not found!'就把额外的这次请求给免了

@Sunnyroger 这里用render的前提是先声明@books = Book.all,这样相比用redirect_to的响应要快些,因为它不用跳转页面。ROR新手的理解。:D

redirect_to 是重新向服务器提交一次 request 请求,而 render 就是直接渲染一个页面,然后 response,要是理解 http 请求的话,这个就非常好理解了。

#4楼 @rorhaha 对的,的确需要提前声明@books=Book.all,这个声明是为什么呢

#6楼 @Sunnyroger 你可以看到show方法只定义了@book,当@book.nil?为true时会渲染 index.html.erb模板,这个模板里面有用到@books, 而render并不会执行index方法里的任何代码,所以就得在show方法里面额外定义@books好传给views了。

render是服务器直接给你页面。 redirect_to是服务器给浏览器地址,浏览器再次请求服务器给自己的哪个地址,跳转。

你的例子中,如果改成render,那么就是服务器直接给你呈现index,但是使用的是show的上下文,index view所需要的参数可能就是空的,逻辑可能会出问题,自己试一试,然后看看日志,就会明白了。

我明白了: render是渲染模板 redirect_to是跳转,也就是发送新的请求到某Action

#2楼 @Sunnyroger #10楼 @dingjop

去某窗口办材料,说完请求后

办事员 render: 准备好你的材料后交给你 办事员 redirect: 交给你一张纸条上面写 ”请去5号窗口办理“

#11楼 @knwang 这才是理解透彻的答案啊 不愧是搞ror教学的 thumb up

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册