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)。
您将遇到两种常用的方法来显示数据render和redirect_to。下面的示例展示了这两种方法是如何工作的
当用户提交更新的数据时,此操作被调用
正如您所见,这两个方法都在这个简单的示例中被使用。每当我们成功更新产品名称时,我们都会被重定向到产品的索引页面。如果更新失败,我们希望返回到编辑视图。
def update
@product= Product.find(params[:id])
if @product.update_attributes(params[:name])
redirect_to :action => 'index'
else
render :edit
end
end
之间有一个重要的区别render和redirect_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与render类似的方式使用,但要记住两者之间的巨大区别render和redirect_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)方法,该方法接受要渲染的文本和局部变量的哈希。=