link_to,redirect_to和render之间有什么区别?
我对Rails中link_to
, redirect_to
和render
之间的主要区别感到困惑。 任何人都可以请解释。
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_to
和render
只能在给定的控制器方法中调用一次。
我其实只是写了一篇关于此的博客文章 。 最重要的位在下面复制(有修改)。
控制器方法: render
与redirect_to
render
和redirect_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标头/正文内容)发送回客户端 。
调用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
某个资源(如果成功)或重新render
之前的表单它,以及任何错误(如果失败)。
正如官方指南所解释 (强调我的),
这两个方法[
render
和redirect_to
]表示Action Controllers中使用的两个基本操作原型: Get-and-show和do-and-redirect 。 大多数行为都是这些主题的变体。
查看方法: render
与link_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的新请求。