跳转到内容

Ruby on Rails/ActionView/渲染和重定向

来自维基教科书,开放世界中的开放书籍

渲染和重定向

[编辑 | 编辑源代码]

您已经了解了如何使用ActiveRecord管理您的数据。现在是时候展示您的数据了。视图显示的所有数据都来自控制器。大多数情况下,您将使用HTML,但您也可以在视图中使用Javascript(当然可以是Rails生成的)或不同的CSS。

“约定优于配置”也是视图的重要组成部分:正如本书开头提到的,Rails能够知道哪个视图文件属于控制器中的哪个操作。

app/controller/products_controller.rb
def show
  @product= Product.find(params[:id])
end

我们产品控制器中的这个操作假设存在一个名为

app/views/products/show.html.erb

正如您所见,该文件有2个扩展名:一个是用于浏览器显示(HTML),另一个是告诉Rails如何处理它(erb=嵌入式Ruby)。

渲染和重定向

[编辑 | 编辑源代码]

您将遇到两种常用的方法来显示数据renderredirect_to。下面的示例展示了这两种方法是如何工作的

当用户提交更新的数据时,此操作被调用

正如您所见,这两个方法都在这个简单的示例中被使用。每当我们成功更新产品名称时,我们都会被重定向到产品的索引页面。如果更新失败,我们希望返回到编辑视图。

def update
    @product= Product.find(params[:id])

    if @product.update_attributes(params[:name])
      redirect_to :action => 'index'
    else
      render :edit
    end
end

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

还记得上面的“update”操作吗?当更新失败时,我们希望渲染编辑视图,使用与之前完全相同的参数,在这种情况下,我们在数据库中查找“id”并相应地填充页面。如果您想渲染另一个视图,请使用

render 'categories/show'


您也可以显示一个完全位于您Web服务器上的不同位置的文件

render :file => "/apps/some_folder/app/views/offers/index"

当然,您可以渲染简单的文本

render :text => "Hello World"

您可能已经注意到在视图中有一个“layout”文件夹。每当您使用脚手架创建应用程序的一部分时,都会在layout中创建一个文件。如果您使用脚手架“Products”,那么layout中的文件将被称为products.html.erb。该文件负责显示与通用名称匹配的网站的基本内容(在本例中是products)。每当您想要将用户重定向到另一个布局时,可以使用

render :layout => 'another_layout'

每当没有合适的布局文件时,Rails将只使用请求视图中提供的样式显示页面。要使用控制器中整个控制器中的特定布局,您可以在控制器中定义布局

class ProductsController < ApplicationController
  layout "my_layout"
  #our actions
end

有关布局的更多信息,请参阅“布局文件”。

redirect_to

[编辑 | 编辑源代码]

您可以使用redirect_to与render类似的方式使用,但要记住两者之间的巨大区别renderredirect_to

使用redirect_to您可以轻松地将用户发送到新的资源,例如我们产品的索引页面。要了解有关路径和路由的更多信息,请参阅“路由”一章。

 redirect_to products_path

非常方便的redirect_to选项是:back

 redirect_to :back

将用户送回他来的网站。

Rails中包含几个模板系统,每个系统都旨在解决不同的问题。

  • ERb - 嵌入式Ruby是Rails应用程序的默认模板系统。所有以.rhtml结尾的文件都被视为ERb模板。
  • Builder - Builder模板是程序化模板,对于渲染XML等标记非常有用。所有以.rxml结尾的模板都被视为builder模板,并包含一个名为xml的变量,它是XmlMarkup的实例。

除了内置的模板系统外,您还可以使用ActionView::Base.register_template_handler(extension, class)方法注册新的模板处理程序。模板处理程序必须实现initialize(base)方法,该方法接受ActionView::Base实例和render(text, locals)方法,该方法接受要渲染的文本和局部变量的哈希。=

华夏公益教科书