- 学习 Ruby on Rails
- Rails 2.1 首页
- Rails 2.1 简介
- Rails 2.1 安装
- Rails 2.1 框架
- Rails 2.1 目录结构
- Rails 2.1 示例
- Rails 2.1 数据库设置
- Rails 2.1 Active Records
- 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 类。
您暂时不必担心 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 方法
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 可以找到特定的书籍。
实现 new 方法
new 方法让 Rails 知道您将创建一个新对象。只需在此方法中添加以下代码。
def new @book = Book.new @subjects = Subject.find(:all) end
当您显示一个页面以供用户输入时,将调用上述方法。这里第二行从数据库中获取所有主题并将它们放入名为 @subjects 的数组中。
实现 create 方法
使用 HTML 表单获取用户输入后,是时候将记录创建到数据库中了。为此,请编辑 book_controller.rb 中的 create 方法以匹配以下内容 -
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 对象从 new 方法传递到 create 的。
下一行是一个条件语句,如果对象正确保存到数据库,则将用户重定向到 list 方法。如果它没有保存,则用户将被送回 new 方法。redirect_to 方法类似于在网页上执行元刷新,它会自动将您转发到您的目的地,无需任何用户交互。
然后 @subjects = Subject.find(:all) 是必需的,以防它没有成功保存数据,并且它与 new 选项的情况类似。
实现 edit 方法
edit 方法看起来与 show 方法几乎相同。这两种方法都用于根据对象的 id 检索单个对象并在页面上显示它。唯一的区别是 show 方法不可编辑。
def edit @book = Book.find(params[:id]) @subjects = Subject.find(:all) end
此方法将被调用以在屏幕上显示数据,以便用户修改。第二行从数据库中获取所有主题并将它们放入名为 @subjects 的数组中。
实现 update 方法
当用户修改数据并希望将更改更新到数据库中时,将调用此方法。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) 行是必需的,以防它没有成功保存数据,然后它就类似于 edit 选项。
实现 delete 方法
如果要删除数据库中的记录,则可以使用此方法。请按如下方式实现此方法。
def delete Book.find(params[:id]).destroy redirect_to :action => 'list' end
第一行根据通过 params 对象传递的参数查找分类,然后使用 destroy 方法将其删除。第二行使用 redirect_to 调用将用户重定向到 list 方法。
显示主题的其他方法
假设您想为用户提供根据给定主题浏览所有书籍的功能。您可以在 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
现在,保存您的控制器文件并退出以进行下一个任务。
接下来是什么?
您已经创建了几乎所有将在后端工作的方法。接下来,我们将创建代码以生成屏幕以显示数据并从用户那里获取输入。