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

现在,保存您的控制器文件并退出以进行下一个任务。

接下来是什么?

您已经创建了几乎所有将在后端工作的方法。接下来,我们将创建代码以生成屏幕以显示数据并从用户那里获取输入。

广告