论坛首页 编程语言技术论坛

render和redirect的理解是否正确?

浏览 8929 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-04-19  
rails中的 render和redirect的对比可不可以看成是 render对应 j2ee中的forward,redirect就是 j2ee中的redirect(一个浏览器重定向)?

例如:我在 controller中find出来一个list,想在view中显示,这种情况只能用 render,render可以保存controller中变量的作用域


  def index
    list=Product.find[...];
    render :action => 'list'
  end


上面如果用 redirect,我在rhtml中就得不到 list了?我看代码好像也是可以的:


redirect_to :action => 'list'


上面用了 redirect,在list中也是可以得到list值的。


具体有哪些区别呢
scaffold生成的代码:
其中这段:

if @hotel.save
      flash[:notice] = 'Hotel was successfully created.'
      redirect_to :action => 'list'
    else
      render :action => 'new'
    end


有 render也有redirect,他们的作用都是跳转到另一个方法,有什么区别?
   发表时间:2007-04-19  
render 好象没有执行想对应的controller方法!而redirect_to 有
0 请登录后投票
   发表时间:2007-04-19  
render :action=>xxx跟render :template=>xxx,
redirect_to :action跟redirect_to url效果一致,
或为了找到要渲染的rhtml页面路径,或确认重定向的url地址。(如ddtlby所说,只是通过:action参数确定页面位置,不会执行action方法)

如果想在当前上下文执行新的action和template,用render_component。

对页面内容的复杂控制,个人感觉capture挺好用的。

另外,与j2ee不同,在action里调用render和redirect_to只是标记执行完该action后的动作,而不会立即执行动作。

def list
  @a = 3
  render
  @a = 4
end

list.rhtml中
<%= @a %>
会输出4.

理解它会避免犯直觉上的错误,理所当然认为调完render、redirect_to自动从action方法中返回是不对的。跟java处理方式差不多,惯用法是 render and return

从《ruby cookbook》中看来的。


0 请登录后投票
   发表时间:2007-04-21  
render 表示当前渲染当前请求的返回结果,redirect 是返回 301 或 302,让浏览器去创建一个新的请求,所以 render 可以得到当前请求的参数、变量,而 redirect 不可以。
0 请登录后投票
   发表时间:2007-04-22  
ddtlby 写道
render 好象没有执行想对应的controller方法!而redirect_to 有


多谢,这应该是核心的区别了!
0 请登录后投票
   发表时间:2007-04-22  
liusong1111 写道
render :action=>xxx跟render :template=>xxx,
redirect_to :action跟redirect_to url效果一致,
或为了找到要渲染的rhtml页面路径,或确认重定向的url地址。(如ddtlby所说,只是通过:action参数确定页面位置,不会执行action方法)

如果想在当前上下文执行新的action和template,用render_component。

对页面内容的复杂控制,个人感觉capture挺好用的。

另外,与j2ee不同,在action里调用render和redirect_to只是标记执行完该action后的动作,而不会立即执行动作。

def list
  @a = 3
  render
  @a = 4
end

list.rhtml中
<%= @a %>
会输出4.

理解它会避免犯直觉上的错误,理所当然认为调完render、redirect_to自动从action方法中返回是不对的。跟java处理方式差不多,惯用法是 render and return

从《ruby cookbook》中看来的。




capture 不知道是做什么用的?  这个赋值操作虽然可以在 render之后执行,但是一般都用在render之前赋值,这样比较符合习惯。
0 请登录后投票
   发表时间:2007-04-22  
hozaka 写道
render 表示当前渲染当前请求的返回结果,redirect 是返回 301 或 302,让浏览器去创建一个新的请求,所以 render 可以得到当前请求的参数、变量,而 redirect 不可以。


“render 可以得到当前请求的参数” ??? render 是用来得到参数使用的? 你说它相当于一个 request ?
0 请登录后投票
   发表时间:2007-04-24  
对不起,我没表述清楚。

我的意思是并不是说 render 相当与一个 request。举个例子,比如当前请求有一个参数 a=1,当前 action a 的结果如果是 render 方法渲染的一个页面,那么这个 action a 内、对应的页面模板内都可以通过 params[:a] 得到这个参数;如果 action a 的结果是 redirect_to :action => 'b',那么就是告诉浏览器重新发一个请求到 action b,如果没有另外传递参数,那么 action b 是得不到 a=1 这个参数的。

至于在 action a 内执行 render :action => 'b',和 redirect_to 也有区别。前者只是让 rails 渲染 action b 对应的页面模板而已,并不会执行 action b 内的代码,而 redirect_to 因为是新的请求了,所以 action b 内的代码会在另一个请求里被执行。
0 请登录后投票
   发表时间:2007-04-24  
引用
rails中的 render和redirect的对比可不可以看成是 render对应 j2ee中的forward,redirect就是 j2ee中的redirect(一个浏览器重定向)?


是。
0 请登录后投票
   发表时间:2007-04-24  
hozaka 写道
对不起,我没表述清楚。

我的意思是并不是说 render 相当与一个 request。举个例子,比如当前请求有一个参数 a=1,当前 action a 的结果如果是 render 方法渲染的一个页面,那么这个 action a 内、对应的页面模板内都可以通过 params[:a] 得到这个参数;如果 action a 的结果是 redirect_to :action => 'b',那么就是告诉浏览器重新发一个请求到 action b,如果没有另外传递参数,那么 action b 是得不到 a=1 这个参数的。

至于在 action a 内执行 render :action => 'b',和 redirect_to 也有区别。前者只是让 rails 渲染 action b 对应的页面模板而已,并不会执行 action b 内的代码,而 redirect_to 因为是新的请求了,所以 action b 内的代码会在另一个请求里被执行。



前者只是让 rails 渲染 action b 对应的页面模板而已,并不会执行 action b 内的代码????
这句话不太理解,呵呵.为什么会不执行里面的代码呢?不执行代码渲染什么?
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics