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

时间:2013-06-21 13:11:49

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1 ruby-on-rails-3.2

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

10 个答案:

答案 0 :(得分:32)

在您的视图中使用

link_to,并为链接生成HTML代码

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

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

<a href="http://google.com">Google</a>

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

答案 1 :(得分:9)

来自Documentation

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

  

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

关于渲染视图

  

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

关于重定向请求

  

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


基本上:

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

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

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

答案 2 :(得分:3)

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

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

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

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

答案 3 :(得分:2)

我实际上是just wrote a blog post about this。最重要的位在下面复制(有修改)。

控制器方法:renderredirect_to

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

  • 用户尝试访问页面 (http://localhost:3000/books/index.html
  • 在幕后,浏览器会在服务器上发送指定路径的HTTP请求 (GET /books/index.html
  • Rails路由系统然后查找哪个控制器对应于给定的请求路径 (books GET /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 说,“告诉客户重新开始整个过程​​,向GET发出新的url_for(@book)请求。

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

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

As the official guides explain(强调我的),

  

这两种方法[renderrender]代表了动作控制器中使用的两个基本动作原型:获取和显示执行 - 和 - 重定向即可。大多数行为都是这些主题的变体。

查看方法:redirect_torender

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

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

app/views/shared/_nav.html.erb只是将锚标记(link_to标记)插入视图模板的便捷方法。这很有用,因为您要链接的很多URL都是应用程序中的其他页面,这些URL可以使用对象或“辅助方法”引用,如下所示:

a href

答案 4 :(得分:1)

在rails中的表单上使用link_to,并且是在html中创建链接元素的帮助程序。其他两个不用于表单,而是用于控制器。

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

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

答案 5 :(得分:1)

link_to将输出标准的html锚点=链接(link_to documentation)

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

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

this rails指南中有很多例子可以解释render和redirect_to。 link_to与rendering和redirect_to

完全不同

答案 6 :(得分:1)

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

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

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

希望我是对的。

答案 7 :(得分:1)

来自官方Rails guides

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

答案 8 :(得分:0)

我找到了一个非常简单的解释here

它们似乎与初学者相似,但有很大不同。 Render告诉Rails向用户显示哪个视图或资产,而不会丢失对控制器操作中定义的任何变量的访问。 重定向是不同的。 redirect_to方法告诉浏览器将请求发送到另一个URL。

答案 9 :(得分:0)

"redirect_to" 将导致浏览器发出新请求,而 "render" 为当前请求渲染指定视图。在改变数据库或应用程序状态后使用 redirect_to 很重要。否则,如果用户刷新页面,浏览器会发出同样的请求,并且会重复修改。

至于“link_to”,link_to 助手渲染一个链接,其第一个参数作为链接的文本,第二个参数作为链接的目的地。如果我们将模型对象作为第二个参数传递,link_to 将调用适当的路径助手将对象转换为路径。例如,如果我们传递一篇文章,link_to 将调用 article_path。