我对 Rails和Rails之间的主要区别感到link_to
困惑。任何人都可以请解释。redirect_to
render
10 回答
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
只能在给定的控制器方法中调用一次。
我实际上只是写了一篇关于这个的博客文章。下面复制了最重要的位(有修改)。
控制器方法:render
vs。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
说,'告诉客户端重新开始整个过程,GET
向url_for(@book)
.
如果两者都省略,则操作将呈现与操作本身同名的模板。换句话说,您只需要在render
您想要的视图模板与您从中渲染它的操作不匹配时显式调用。
请注意,并非每个控制器操作都有相应的视图模板。通常,#create
、#update
和#destroy
(它们都被路由到非GET
HTTP 请求)尝试对数据库进行一些更改,然后尝试对redirect_to
一些资源(如果成功)或重新render
生成它之前的表单,以及任何错误(如果失败的)。
正如官方指南所解释的(强调我的),
这两个方法 [
render
和redirect_to
] 代表了动作控制器中使用的两个基本动作原型:Get-and-show和do-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
link_to 创建指向特定 URL 的超链接,该 URL 出现在 HTML 中。
redirect_to 将根据某些选项决定将您链接到哪里。例如,如果某人以用户身份登录,您可能希望向他显示他的设置页面,否则将重定向到主页。
渲染将打开渲染文件,获取其内容并将其粘贴到现有文件中,然后将整个块发送给接收者。
希望我是对的。
Alink_to
用于 rails 中的表单,是在 html 中创建链接元素的助手。另外两个不用于表单,而是用于控制器。
如果您render
的控制器方法链接到该页面,则您是一个页面。例如,调用“new”应该呈现“new item”页面。他们满足了刚刚提出的要求。
redirect
正是用于 - 重定向。例如,如果您尝试访问必须登录的页面,您会将用户重定向到登录页面。因此,重定向基本上会产生一个新请求。
link_to 将输出一个标准的 html anchor=a 链接(link_to 文档)
redirect_to 通常用于更新和删除等页面响应。它将采用您提供的参数并适当地引导您的页面。
(redirect_to 文档)
render 用于加载部分文件或将特定的 .erb 文件加载到其他文件中。(render 文档)这个rails 指南
上有很多例子应该解释 render 和 redirect_to。link_to 与 render 和 redirect_to 有很大不同
来自官方Rails 指南:
如您所见,render 告诉 Rails 在构建响应时使用哪个视图(或其他资产)。redirect_to 方法做了一些完全不同的事情:它告诉浏览器发送一个对不同 URL 的新请求。
我在这里找到了一个非常简单的解释:
它们可能看起来与初学者相似,但它们却大不相同。Render 告诉 Rails 向用户显示哪个视图或资产,而不会失去对控制器操作中定义的任何变量的访问权限。重定向不同。redirect_to 方法告诉您的浏览器向另一个 URL 发送请求。
从rails docs用不同的词基本上是一样的:
render 和redirect_to 之间有一个重要区别:render 会告诉Rails 它应该使用哪个视图(使用您可能已经发送的相同参数)但redirect_to 会向浏览器发送一个新请求。
“redirect_to”将导致浏览器发出新请求,而“render”为当前请求呈现指定视图。在改变数据库或应用程序状态后使用 redirect_to 很重要。否则,如果用户刷新页面,浏览器会发出同样的请求,重复突变。
至于“link_to”,link_to 助手渲染一个链接,它的第一个参数作为链接的文本,第二个参数作为链接的目的地。如果我们将模型对象作为第二个参数传递,link_to 将调用适当的路径助手将对象转换为路径。例如,如果我们传递一篇文章,link_to 将调用 article_path。