【发布时间】:2013-06-21 13:11:48
【问题描述】:
我对 Rails 中 link_to、redirect_to 和 render 之间的主要区别感到困惑。谁能解释一下。
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1 ruby-on-rails-3.2
我对 Rails 中 link_to、redirect_to 和 render 之间的主要区别感到困惑。谁能解释一下。
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1 ruby-on-rails-3.2
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
【讨论】:
关于渲染视图与重定向请求
。 . . render 告诉 Rails 在构建响应时使用哪个视图(或其他资产)。 redirect_to 方法做了一些完全不同的事情:它告诉浏览器发送一个不同 URL 的新请求。
关于渲染视图
。 . . render :action 不会在目标操作中运行任何代码。 . .
关于重定向请求
。 . .您的代码停止运行并等待浏览器的新请求。碰巧你已经通过发回 HTTP 302 状态码告诉浏览器接下来应该发出什么请求。
基本上:
link_to 是一种帮助方法来生成通常在您的视图中使用的 URL(.html.erb 文件)
render 告诉您的控制器渲染视图而不将任何数据(例如,来自表单)传递给下一个控制器操作。
redirect_to 执行 302 页面重定向,将数据(例如,来自表单)传递到您的网络应用程序上的控制器操作或外部应用程序(例如:google、facebook、网络文章你喜欢,等等)
【讨论】:
link_to 用于 ERB 模板。它输出指向特定路径或 url 的链接。
redirect_to 用于控制器。一旦控制器方法退出,它会导致客户端请求指定的路径或url。
render 也可用于控制器。它使 Rails 呈现指定的模板。
redirect_to 和 render 在给定的控制器方法中只能调用一次。
【讨论】:
我实际上是just wrote a blog post about this。最重要的部分复制如下(有修改)。
render 与 redirect_to
render 和redirect_to 是控制器动作结束的两种方式(一般来说)。要了解它们是如何工作的,让我们回顾一下控制器在 Rails 应用程序中的作用:
GET /books/index.html)books GET /books/index(.:format) books#index)这最后一步在您调用 render 或 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 文档,然后将其发送回客户端。 '
redirect_to @book 说,'告诉客户端重新开始整个过程,向url_for(@book)发出一个新的GET请求。
如果两者都省略,则动作将呈现与动作本身同名的模板。换句话说,您只需要在您想要的视图模板与您从中渲染它的操作不匹配时显式调用render。
请注意,并非每个控制器操作都有相应的视图模板。通常,#create、#update 和 #destroy(它们都被路由到非GET HTTP 请求)尝试对数据库进行一些更改,然后 redirect_to 一些资源(如果成功)或re-render 之前的表单,以及任何错误(如果失败)。
As the official guides explain(强调我的),
这两个方法 [
render和redirect_to] 代表了动作控制器中使用的两个基本动作原型:Get-and-show 和 do-and-redirect。大多数动作都是这些主题的变体。
render vs. link_to
render 也用于视图模板本身。它不是生成完整的 HTML 文档,而是用于将 局部视图模板 插入到较大的文档中。结果如下:
_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 <a href="/books">Back</a>
= link_to 'View', @book # renders as <a href="/book/1">View</a> or similar
【讨论】:
link_to 用于 Rails 中的表单,是在 html 中创建链接元素的助手。其他两个不是在表单中使用,而是在控制器中使用。
如果您的控制器方法链接到该页面,则您 render 一个页面。例如。调用“新”应该呈现“新项目”页面。他们完成了刚刚提出的请求。
redirect 正是用于此 - 重定向。例如,如果您尝试访问必须登录的页面,您会将用户重定向到登录页面。因此,重定向基本上会产生一个新请求。
【讨论】:
link_to 将输出一个标准的 html anchor=a 链接 (link_to documentation)
redirect_to 通常用于更新和删除等页面响应。它将采用您提供的参数并适当地引导您的页面。
(redirect_to documentation)
render 用于加载部分文件或将特定的 .erb 文件加载到其他文件中。 (render documentation)
this rails 指南上有很多例子应该解释渲染和redirect_to。 link_to 与 render 和 redirect_to 有很大不同
【讨论】:
link_to 创建指向特定 URL 的超链接,该 URL 出现在 HTML 中。
redirect_to 将根据某些选项决定将您链接到哪里。例如,如果某人以用户身份登录,您可能希望向他显示他的设置页面,否则将重定向到主页。
渲染将打开渲染文件,获取其内容并将其粘贴到现有文件中,然后将整个块发送给接收者。
希望我是对的。
【讨论】:
来自官方Rails guides:
如您所见,render 告诉 Rails 在构建响应时使用哪个视图(或其他资产)。 redirect_to 方法做了一些完全不同的事情:它告诉浏览器发送一个不同 URL 的新请求。
【讨论】:
我找到了一个很简单的解释here:
它们可能看起来与初学者相似,但它们却大不相同。 Render 告诉 Rails 向用户显示哪个视图或资产,而不会失去对控制器操作中定义的任何变量的访问权限。 重定向不同。 redirect_to 方法告诉您的浏览器向另一个 URL 发送请求。
和rails docs不同的话基本上是一样的:
render 和 redirect_to 之间有一个重要区别:render 会告诉 Rails 它应该使用哪个视图(使用您可能已经发送的相同参数),但 redirect_to 会向浏览器发送一个新请求。
【讨论】:
“redirect_to”将导致浏览器发出新请求,而“render”为当前请求呈现指定视图。在改变数据库或应用程序状态后使用 redirect_to 很重要。否则,如果用户刷新页面,浏览器会发出同样的请求,重复mutation。
对于“link_to”,link_to 助手渲染一个链接,它的第一个参数作为链接的文本,第二个参数作为链接的目的地。如果我们将模型对象作为第二个参数传递,link_to 将调用适当的路径助手将对象转换为路径。例如,如果我们传递一篇文章,link_to 会调用 article_path。
【讨论】: