34

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

4

10 回答 10

34

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 和渲染方法 http://guides.rubyonrails.org/layouts_and_rendering.html

于 2013-06-21T13:20:12.613 回答
10

文档

关于呈现视图与重定向请求

. . . render 告诉 Rails 在构建响应时使用哪个视图(或其他资产)。redirect_to 方法做了一些完全不同的事情:它告诉浏览器发送一个对不同 URL 的新请求。

关于渲染视图

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

关于重定向请求

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


基本上:

link_to是一种帮助方法,用于生成通常在您的视图中使用的 URL(.html.erb文件)

render告诉您的控制器渲染视图而不将任何数据(例如,来自表单)传递给下一个控制器操作。

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

于 2014-05-21T20:14:19.287 回答
3

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

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

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

redirect_to并且render只能在给定的控制器方法中调用一次。

于 2013-06-21T13:18:11.807 回答
3

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

控制器方法:rendervs。redirect_to

render并且redirect_to是控制器动作结束的两种方式(一般来说)。要了解它们是如何工作的,让我们回顾一下控制器在 Rails 应用程序中的作用:

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

render这最后一步在您调用or时显式发生redirect_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 文档,然后将其发送回客户端。”</p>

redirect_to @book说,'告诉客户端重新开始整个过程​​,GETurl_for(@book).

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

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

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

这两个方法 [renderredirect_to] 代表了动作控制器中使用的两个基本动作原型:Get-and-showdo-and-redirect。大多数动作都是这些主题的变体。


查看方法:render对比link_to

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

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

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

= link_to 'Back', books_path   # renders as <a href="/books">Back</a>
= link_to 'View', @book        # renders as <a href="/book/1">View</a> or similar
于 2017-08-24T15:52:41.030 回答
1

link_to 创建指向特定 URL 的超链接,该 URL 出现在 HTML 中。

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

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

希望我是对的。

于 2013-06-21T13:24:54.807 回答
1

Alink_to用于 rails 中的表单,是在 html 中创建链接元素的助手。另外两个不用于表单,而是用于控制器。

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

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

于 2013-06-21T13:18:32.547 回答
1

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

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

render 用于加载部分文件或将特定的 .erb 文件加载到其他文件中。(render 文档)这个rails 指南

上有很多例子应该解释 render 和 redirect_to。link_to 与 render 和 redirect_to 有很大不同

于 2013-06-21T13:20:51.833 回答
1

来自官方Rails 指南

如您所见,render 告诉 Rails 在构建响应时使用哪个视图(或其他资产)。redirect_to 方法做了一些完全不同的事情:它告诉浏览器发送一个对不同 URL 的新请求。
于 2013-08-06T10:19:45.057 回答
0

我在这里找到了一个非常简单的解释:

它们可能看起来与初学者相似,但它们却大不相同。Render 告诉 Rails 向用户显示哪个视图或资产,而不会失去对控制器操作中定义的任何变量的访问权限。重定向不同。redirect_to 方法告诉您的浏览器向另一个 URL 发送请求。

从rails docs用不同的词基本上是一样的:

render 和redirect_to 之间有一个重要区别:render 会告诉Rails 它应该使用哪个视图(使用您可能已经发送的相同参数)但redirect_to 会向浏览器发送一个新请求。

于 2020-10-06T00:39:33.573 回答
0

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

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

于 2020-12-26T14:08:01.877 回答