link_to,redirect_to和render之间有什么区别?

我对Rails中link_toredirect_torender之间的主要区别感到困惑。 任何人都可以请解释。

link_to在您的视图中使用,并为链接生成html代码

 <%= link_to "Google", "http://google.com" %> 

这将在您的视图中生成以下html

 Google 

redirect_to和render在您的控制器中用于回复请求。 如果在您添加的控制器中,redirect_to只会将请求重定向到新的URL

 redirect_to "http://google.com" 

访问您网页的所有人都将被有效地重定向到Google

render可以在很多方面使用,但它主要用于渲染你的html视图。

 render "article/show" 

这将呈现视图“app / views / article / show.html.erb”

以下链接将更详细地解释redirect_to和render方法http://guides.rubyonrails.org/layouts_and_rendering.html

来自文档 :

关于渲染视图与重定向请求

render告诉Rails在构造响应时使用哪个视图(或其他资源)。 redirect_to方法完全不同:它告诉浏览器发送一个不同URL的新请求。

关于渲染视图

render:action不会在目标操作中运行任何代码。

关于重定向请求

您的代码停止运行并等待浏览器的新请求。 只是通过发送回HTTP 302状态代码,您已经告诉浏览器接下来应该做什么请求。


基本上:

link_to是生成视图中常用的URL的辅助方法( .html.erb文件)

渲染告诉控制器渲染视图而不将任何数据(例如,从表单)传递到下一个控制器操作。

redirect_to执行302页面重定向,将数据(例如,从表单)传递到Web应用程序上的控制器操作或外部应用程序(例如:google,facebook,您喜欢的Web文章等)

link_to用于ERB模板。 它输出指向特定路径或URL的链接。

redirect_to用于控制器。 一旦控制器方法退出,它会导致客户端请求指定的路径或URL。

render也用于控制器。 它导致Rails呈现指定的模板。

redirect_torender只能在给定的控制器方法中调用一次。

我其实只是写了一篇关于此的博客文章 。 最重要的位在下面复制(有修改)。

控制器方法: renderredirect_to

renderredirect_to是控制器动作结束的两种方式(一般来说)。 要了解它们的工作原理,让我们回顾一下Rails应用程序中的控制器:

  • 用户尝试访问页面。
    ( http:// localhost:3000 / books / index.html )
  • 在引擎盖下,浏览器发送服务器上指定路径的HTTP请求。
    GET https://stackoverflow.com/books/index.html
  • 然后,Rails路由系统查​​找哪个控制器对应于给定的请求路径。
    books GET https://stackoverflow.com/books/index(.:format) books#index
  • 控制器准备一些数据,然后告诉服务器将什么响应( 即, HTTP标头/正文内容)发送回客户端

调用renderredirect_to时会显式执行此最后一步, 如果将其保留,则会隐式显示

那是,

 def index @books = Book.all end 

是相同的

 def index @books = Book.all render :index end 

render :index说,’将我准备好的数据( @books = Book.all )与books/index.html.erb视图模板相结合,生成一个完整的HTML文档,然后将其发送回客户端。

redirect_to @book说,“告诉客户端再次启动整个过程,向url_for(@book)发出新的GET请求。

如果省略两者,则操作将呈现与操作本身同名的模板。 换句话说,当您想要的视图模板与您渲染它的动作不匹配时,您只需要显式调用render

请注意,并非每个控制器操作都具有相应的视图模板。 通常, #create#update#destroy (都被路由到非GET HTTP请求)尝试对数据库进行一些更改,然后redirect_to某个资源(如果成功)或重新render之前的表单它,以及任何错误(如果失败)。

正如官方指南所解释 (强调我的),

这两个方法[ renderredirect_to ]表示Action Controllers中使用的两个基本操作原型: Get-and-showdo-and-redirect 。 大多数行为都是这些主题的变体。


查看方法: renderlink_to

render也在视图模板中使用。 它不是生成完整的HTML文档,而是用于将部分视图模板插入到较大的文档中 。 这是结果:

  • 您可以创建要插入标准模板的部分视图模板文件(将它们视为模块化页面组件)。
  • partials的文件名必须以下划线开头( 例如, _nav.html.erb )。
  • 如果要从位于同一文件夹中的视图中包含_nav.html.erb部分请使用render 'nav'
  • 如果要在项目的任何视图中将部分包含在app/views/shared/_nav.html.erb 请使用render 'shared/nav'
  • 存在各种选项和简写语法,用于将数据传递到部分,从集合对象渲染多个部分等等。 有关详细信息,请参阅指南

link_to只是一种将锚标签( a href标签)插入视图模板的便捷方法。 这很有用,因为您要链接的许多URL是应用程序中的其他页面,并且可以使用对象或“帮助程序方法”引用这些URL,如下所示:

 = link_to 'Back', books_path # renders as Back = link_to 'View', @book # renders as View or similar 

link_to用在rails中的表单上,是在html中创建link元素的帮助器。 其他两个不用于表单,而是用于控制器。

如果控制器方法链接到该页面,则render页面。 例如,调用’new’应该呈现’new item’页面。 他们满足了刚刚提出的要求。

redirect用于完全相同 – 重定向。 例如,如果您尝试访问必须登录的页面,则会将用户重定向到登录页面。 因此,重定向基本上会产生一个新请求。

link_to将输出一个标准的html anchor =一个链接(link_to文档)

redirect_to通常用于页面响应,例如更新和删除。 它将采用您提供的参数并将适当地引导您的页面。 (redirect_to文档)

render用于加载partials或将特定的.erb文件加载到其他文件中。 (渲染文档)

这个 rails指南中有很多例子,应该解释render和redirect_to。 link_to与rendering和redirect_to完全不同

link_to创建指向特定URL的超链接,该URL显示在HTML上。

redirect_to将决定将您链接到哪里,具体取决于某些选项。 例如,如果有人以用户身份登录,您可能希望向他显示他的设置页面,否则重定向到主页。

在将整个块发送给收件人之前,渲染将打开渲染文件,获取其内容并将其粘贴到现有文件中。

希望我是对的。

从官方Rails指南 :

正如您所见,render告诉Rails在构建响应时使用哪个视图(或其他资源)。 redirect_to方法完全不同:它告诉浏览器发送一个不同URL的新请求。