- 学习 Ruby on Rails
- Rails 2.1 主页
- Rails 2.1 简介
- 导轨 2.1 安装
- Rails 2.1 框架
- Rails 2.1 目录结构
- Rails 2.1 示例
- Rails 2.1 数据库设置
- Rails 2.1 活动记录
- Rails 2.1 迁移
- Rails 2.1 控制器
- Rails 2.1 视图
- Rails 2.1 布局
- Rails 2.1 脚手架
- Rails 2.1 和 AJAX
- Rails 2.1 上传文件
- Rails 2.1 发送电子邮件
- 高级 Ruby on Rails 2.1
- Rails 2.1 RMagick 指南
- Rails 2.1 基本 HTTP 身份验证
- Rails 2.1 错误处理
- Rails 2.1 路线系统
- Rails 2.1 单元测试
- 高级 Ruby on Rails 2.1
- Rails 2.1 提示与技巧
- 快速参考指南
- 快速参考指南
- Ruby on Rails 2.1 有用资源
- Ruby on Rails 2.1 - 资源
- Ruby on Rails 2.1 - 讨论
Ruby on Rails 2.1 - 控制器
Rails 控制器是应用程序的逻辑中心。它协调用户、视图和模型之间的交互。该控制器也是许多重要辅助服务的所在地。
它负责将外部请求路由到内部操作。它可以很好地处理人性化的 URL。
它管理缓存,可以使应用程序的性能得到数个数量级的提升。
它管理帮助程序模块,这些模块扩展了视图模板的功能,而无需增加代码量。
它管理会话,给用户留下与我们的应用程序持续交互的印象。
创建控制器的过程非常简单,它与我们已经用于创建模型的过程类似。我们将在这里创建一个控制器 -
C:\ruby\library\> ruby script/generate controller Book
请注意,您将 Book 大写并使用单数形式。这是每次创建控制器时都应该遵循的 Rails 范例。
该命令完成多项任务,其中以下内容与此处相关 -
它创建一个名为 app/controllers/book_controller.rb 的文件。
如果您查看 book_controller.rb,您会发现它如下 -
class BookController < ApplicationController end
控制器类继承自 ApplicationController,它是控制器文件夹中的另一个文件:application.rb。
ApplicationController包含可以在所有控制器中运行的代码,它继承自 Rails ActionController ::Base class。
目前您还不需要担心 ApplicationController,因此我们只需在book_controller.rb中定义一些方法存根即可。根据您的要求,您可以在此文件中定义任意数量的函数。
修改文件如下所示并保存更改。请注意,您想为这些方法指定什么名称取决于您,但最好指定相关名称。
class BookController < ApplicationController def list end def show end def new end def create end def edit end def update end def delete end end
现在我们来一一实现一下所有的方法。
实现列表方法
list 方法为您提供数据库中所有书籍的打印输出。该功能将通过以下代码行来实现。
def list @books = Book.find(:all) end
list 方法中的@books = Book.find(:all)行告诉 Rails 搜索 books 表并将找到的每一行存储在 @books 实例对象中。
实现show方法
show 方法仅显示单本书的更多详细信息。该功能将通过以下代码行来实现。
def show @book = Book.find(params[:id]) end
show 方法的@books = Book.find(params[:id])行告诉 Rails 仅查找具有 params[:id] 中定义的 id 的书。
params对象是一个容器,使您能够在方法调用之间传递值。例如,当您在 list 方法调用的页面上时,您可以单击特定书籍的链接,它会通过 params 对象传递该书籍的 id,以便 show 可以找到特定书籍。
实施新方法
新方法让 Rails 知道您将创建一个新对象。只需在该方法中添加以下代码即可。
def new @book = Book.new @subjects = Subject.find(:all) end
当您向用户显示页面以接受用户输入时,将调用上述方法。这里第二行从数据库中获取所有主题并将它们放入名为@subjects 的数组中。
实现创建方法
使用 HTML 表单获取用户输入后,就可以在数据库中创建记录了。为此,请编辑 book_controller.rb 中的创建方法以匹配以下内容 -
def create @book = Book.new(params[:book]) if @book.save redirect_to :action => 'list' else @subjects = Subject.find(:all) render :action => 'new' end end
第一行创建一个名为 @book 的新实例变量,它保存根据用户提交的数据构建的 Book 对象。数据是从新方法传递来使用 params 对象创建的。
下一行是条件语句,如果对象正确保存到数据库,则将用户重定向到列表方法。如果不保存,用户将被发送回新方法。redirect_to 方法类似于在网页上执行元刷新,它会自动将您转发到目的地,而无需任何用户交互。
然后@subjects = subject.find(:all)是必需的,以防它没有成功保存数据并且它变得与新选项类似的情况。
实现编辑方法
edit 方法看起来与 show 方法几乎相同。这两种方法都用于根据 id 检索单个对象并将其显示在页面上。唯一的区别是 show 方法不可编辑。
def edit @book = Book.find(params[:id]) @subjects = Subject.find(:all) end
将调用该方法将数据显示在屏幕上以供用户修改。第二行从数据库中获取所有主题并将它们放入名为@subjects 的数组中。
实现更新方法
当用户修改数据并希望将更改更新到数据库时,将在编辑方法之后调用此方法。update方法与create方法类似,将用于更新数据库中现有的书籍。
def update @book = Book.find(params[:id]) if @book.update_attributes(params[:book]) redirect_to :action => 'show', :id => @book else @subjects = Subject.find(:all) render :action => 'edit' end end
update_attributes 方法与 create 使用的 save 方法类似,但它不是在数据库中创建新行,而是覆盖现有行的属性。
然后@subjects = subject.find(:all)行是必需的,以防它没有成功保存数据,然后它变得类似于编辑选项。
实现删除方法
如果您想删除数据库中的记录,那么您将使用此方法。按如下方式实现该方法。
def delete Book.find(params[:id]).destroy redirect_to :action => 'list' end
第一行根据通过 params 对象传递的参数找到分类,然后使用 destroy 方法将其删除。第二行使用redirect_to 调用将用户重定向到列表方法。
显示主题的其他方法
假设您想为用户提供一种工具来浏览基于给定主题的所有书籍。您可以在 book_controller.rb 中创建一个方法来显示所有主题。假设方法名称为show_subjects:
def show_subjects @subject = Subject.find(params[:id]) end
最后,您的book_controller.rb文件将如下所示 -
class BookController < ApplicationController def list @books = Book.find(:all) end def show @book = Book.find(params[:id]) end def new @book = Book.new @subjects = Subject.find(:all) end def create @book = Book.new(params[:book]) if @book.save redirect_to :action => 'list' else @subjects = Subject.find(:all) render :action => 'new' end end def edit @book = Book.find(params[:id]) @subjects = Subject.find(:all) end def update @book = Book.find(params[:id]) if @book.update_attributes(params[:book]) redirect_to :action => 'show', :id => @book else @subjects = Subject.find(:all) render :action => 'edit' end end def delete Book.find(params[:id]).destroy redirect_to :action => 'list' end def show_subjects @subject = Subject.find(params[:id]) end end
现在,保存您的控制器文件并进行下一个任务。
下一步是什么?
您已经创建了几乎所有可在后端运行的方法。接下来,我们将创建一个代码来生成屏幕以显示数据并接受用户的输入。