【问题标题】:what is the difference between link_to, redirect_to, and render?link_to、redirect_to 和 render 有什么区别?
【发布时间】:2013-06-21 13:11:48
【问题描述】:

我对 Rails 中 link_toredirect_torender 之间的主要区别感到困惑。谁能解释一下。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1 ruby-on-rails-3.2


    【解决方案1】:

    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

    【讨论】:

    • 哪些涉及浏览器向网络服务器发出新请求?
    【解决方案2】:

    来自Documentation

    关于渲染视图与重定向请求

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

    关于渲染视图

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

    关于重定向请求

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


    基本上:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      redirect_torender 在给定的控制器方法中只能调用一次。

      【讨论】:

        【解决方案4】:

        我实际上是just wrote a blog post about this。最重要的部分复制如下(有修改)。

        控制器方法:renderredirect_to

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

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

        这最后一步在您调用 renderredirect_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(强调我的),

        这两个方法 [renderredirect_to] 代表了动作控制器中使用的两个基本动作原型:Get-and-showdo-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'从项目中的任何视图
        • 存在各种选项和速记语法,用于将数据传递到部分、从集合对象呈现多个部分等。详情请见the guides

        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
        

        【讨论】:

          【解决方案5】:

          link_to 用于 Rails 中的表单,是在 html 中创建链接元素的助手。其他两个不是在表单中使用,而是在控制器中使用。

          如果您的控制器方法链接到该页面,则您 render 一个页面。例如。调用“新”应该呈现“新项目”页面。他们完成了刚刚提出的请求。

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

          【讨论】:

            【解决方案6】:

            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 有很大不同

            【讨论】:

              【解决方案7】:

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

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

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

              希望我是对的。

              【讨论】:

                【解决方案8】:

                来自官方Rails guides

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

                【讨论】:

                  【解决方案9】:

                  我找到了一个很简单的解释here

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

                  rails docs不同的话基本上是一样的:

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

                  【讨论】:

                    【解决方案10】:

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

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

                    【讨论】:

                      猜你喜欢
                      • 2011-07-06
                      • 1970-01-01
                      • 2012-12-31
                      • 1970-01-01
                      • 2022-11-22
                      • 2018-03-12
                      • 1970-01-01
                      • 2010-12-11
                      • 2018-09-21
                      相关资源
                      最近更新 更多