- Ruby on Rails 教程
- Ruby on Rails - 首页
- Ruby on Rails - 简介
- Ruby on Rails - 安装
- Ruby on Rails - 框架
- Ruby on Rails - 目录结构
- Ruby on Rails - 示例
- Ruby on Rails - 数据库设置
- Ruby on Rails - Active Records
- Ruby on Rails - 数据迁移
- Ruby on Rails - 控制器
- Ruby on Rails - 路由
- Ruby on Rails - 视图
- Ruby on Rails - 布局
- Ruby on Rails - 脚手架
- Ruby on Rails - AJAX
- Ruby on Rails - 文件上传
- Ruby on Rails - 发送邮件
- Ruby on Rails 资源
- Ruby on Rails - 参考指南
- Ruby on Rails - 快速指南
- Ruby on Rails - 资源
- Ruby on Rails - 讨论
- Ruby 教程
- Ruby 教程
Ruby on Rails - 控制器
Rails 控制器是应用程序的逻辑中心。它协调用户、视图和模型之间的交互。控制器也是许多重要辅助服务的所在地。
它负责将外部请求路由到内部操作。它非常擅长处理用户友好的 URL。
它管理缓存,这可以使应用程序的性能提升数个数量级。
它管理辅助模块,这些模块扩展了视图模板的功能,而不会增加其代码量。
它管理会话,让用户感觉与我们的应用程序进行了持续的交互。
创建控制器的过程非常简单,它与我们之前创建模型的过程类似。我们在这里只创建一个控制器:
library\> rails 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 方法为您提供数据库中所有书籍的列表。此功能将通过以下几行代码实现。编辑 book_controller.rb 文件中的以下几行。
def list @books = Book.all end
list 方法中的 @books = Book.all 行告诉 Rails 搜索 books 表并将找到的每一行存储在 @books 实例对象中。
实现 show 方法
show 方法仅显示单个书籍的更多详细信息。此功能将通过以下几行代码实现。
def show @book = Book.find(params[:id]) end
show 方法的 @book = Book.find(params[:id]) 行告诉 Rails 只查找 params[:id] 中定义了 id 的书籍。
params 对象是一个容器,使您能够在方法调用之间传递值。例如,当您在 list 方法调用的页面上时,您可以单击特定书籍的链接,它会通过 params 对象传递该书籍的 id,以便 show 可以找到该特定书籍。
实现 new 方法
new 方法让 Rails 知道您将创建一个新对象。因此,只需在此方法中添加以下代码。
def new @book = Book.new @subjects = Subject.all end
当您向用户显示页面以获取用户输入时,将调用上述方法。第二行从数据库中获取所有主题并将它们放入名为 @subjects 的数组中。
实现 create 方法
使用 HTML 表单获取用户输入后,是时候将记录创建到数据库中了。为此,请编辑 book_controller.rb 中的 create 方法以匹配以下内容:
def create @book = Book.new(book_params) if @book.save redirect_to :action => 'list' else @subjects = Subject.all render :action => 'new' end end def book_params params.require(:books).permit(:title, :price, :subject_id, :description) end
第一行创建一个名为 @book 的新实例变量,该变量保存由用户提交的数据构建的 Book 对象。book_params 方法用于从对象 :books 收集所有字段。数据是从 new 方法通过 params 对象传递给 create 的。
下一行是一个条件语句,如果对象正确保存到数据库,则将用户重定向到 list 方法。如果它没有保存,则用户将被送回 new 方法。redirect_to 方法类似于在网页上执行元刷新:它会在没有任何用户交互的情况下自动将您转发到您的目的地。
然后需要 @subjects = Subject.all,以防它未能成功保存数据,它将与 new 选项类似。
实现 edit 方法
edit 方法看起来几乎与 show 方法相同。这两种方法都用于根据对象的 id 检索单个对象并在页面上显示它。唯一的区别是 show 方法不可编辑。
def edit @book = Book.find(params[:id]) @subjects = Subject.all end
此方法将被调用以在屏幕上显示数据,以便用户修改。第二行从数据库中获取所有主题并将它们放入名为 @subjects 的数组中。
实现 update 方法
当用户修改数据并希望将更改更新到数据库时,将调用此方法。update 方法类似于 create 方法,将用于更新数据库中现有的书籍。
def update @book = Book.find(params[:id]) if @book.update_attributes(book_param) redirect_to :action => 'show', :id => @book else @subjects = Subject.all render :action => 'edit' end end def book_param params.require(:book).permit(:title, :price, :subject_id, :description) end
update_attributes 方法类似于 create 使用的 save 方法,但它不是在数据库中创建新行,而是覆盖现有行的属性。
然后需要 @subjects = Subject.all 行,以防它未能成功保存数据,那么它将类似于编辑选项。
实现 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 BooksController < ApplicationController def list @books = Book.all end def show @book = Book.find(params[:id]) end def new @book = Book.new @subjects = Subject.all end def book_params params.require(:books).permit(:title, :price, :subject_id, :description) end def create @book = Book.new(book_params) if @book.save redirect_to :action => 'list' else @subjects = Subject.all render :action => 'new' end end def edit @book = Book.find(params[:id]) @subjects = Subject.all end def book_param params.require(:book).permit(:title, :price, :subject_id, :description) end def update @book = Book.find(params[:id]) if @book.update_attributes(book_param) redirect_to :action => 'show', :id => @book else @subjects = Subject.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
现在保存您的控制器文件。
接下来是什么?
您已经创建了几乎所有将在后端运行的方法。接下来,我们将为操作定义路由(URL)。