我对Rails中link_to
,redirect_to
和render
之间的主要区别感到困惑。任何人都可以请解释。
答案 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)
关于渲染视图与重定向请求
。 。 。 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_to
和render
只能在给定的控制器方法中调用一次。
答案 3 :(得分:2)
我实际上是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
说,“告诉客户重新开始整个过程,向GET
发出新的url_for(@book)
请求。
如果省略两者,则操作将呈现与操作本身同名的模板。换句话说,当您想要的视图模板与您渲染的视图模板不匹配时,您只需要显式调用render
。
请注意,并非每个控制器操作都有相应的视图模板。通常,#create
,#update
和#destroy
(都会路由到非GET
HTTP请求)尝试对数据库进行一些更改,然后{{1某些资源(如果成功)或重新redirect_to
前面的表单,以及任何错误(如果失败)。
As the official guides explain(强调我的),
这两种方法[
render
和render
]代表了动作控制器中使用的两个基本动作原型:获取和显示和执行 - 和 - 重定向即可。大多数行为都是这些主题的变体。
redirect_to
与render
link_to
也在视图模板中使用。它不是生成完整的HTML文档,而是用于将部分视图模板插入到较大的文档中。这是结果:
render
)。_nav.html.erb
部分 ,请使用render 'nav'
。_nav.html.erb
,请使用render 'shared/nav'
。 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。