📅  最后修改于: 2020-10-20 05:28:25             🧑  作者: Mango
Rails控制器是您应用程序的逻辑中心。它协调用户,视图和模型之间的交互。控制器也是许多重要辅助服务的所在地。
它负责将外部请求路由到内部操作。它可以很好地处理人性化的URL。
它管理缓存,可以使应用程序性能得到数量级的提升。
它管理帮助程序模块,这些模块扩展了视图模板的功能,而无需增加其代码。
它管理会话,给用户留下与我们的应用程序进行持续交互的印象。
创建控制器的过程非常简单,它类似于我们已经用于创建模型的过程。我们将在这里仅创建一个控制器-
library\> rails generate controller Book
请注意,您正在大写Book并使用单数形式。这是每次创建控制器时都应遵循的Rails范例。
该命令完成了几项任务,其中以下几项与之相关-
它创建一个名为app / controllers / book_controller.rb的文件
如果查看book_controller.rb,您将发现以下内容:
class BookController < ApplicationController
end
控制器类继承自ApplicationController,后者是controllers文件夹中的另一个文件: 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方法为您提供数据库中所有书籍的列表。此功能将通过以下代码行实现。编辑book_controller.rb文件中的以下行。
def list
@books = Book.all
end
list方法中的@books = Book.all行告诉Rails搜索books表并将找到的每一行存储在@books实例对象中。
show方法仅在一本书上显示更多详细信息。此功能将通过以下代码行实现。
def show
@book = Book.find(params[:id])
end
show方法的@book = Book.find(params [:id])行告诉Rails仅查找具有在params [:id]中定义的id的书。
params对象是一个容器,使您可以在方法调用之间传递值。例如,当您在使用list方法调用的页面上时,可以单击特定书籍的链接,然后该链接通过params对象传递该书籍的ID,以便节目可以找到特定书籍。
新方法使Rails知道您将创建一个新对象。因此,只需在此方法中添加以下代码。
def new
@book = Book.new
@subjects = Subject.all
end
当您向用户显示页面以接受用户输入时,将调用上述方法。在这里,第二行从数据库中获取所有主题,并将它们放入名为@subjects的数组中。
使用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方法用于从object :books收集所有字段。数据是通过使用params对象创建的新方法传递的。
下一行是一个条件语句,如果对象正确保存到数据库,则该条件语句会将用户重定向到list方法。如果不保存,则会将用户发送回新方法。 redirect_to方法类似于在网页上执行元刷新:它自动将您转发到目的地,而无需任何用户交互。
然后@subjects = Subject.all是必需的,以防它无法成功保存数据,并且情况与新选项类似。
edit方法看起来与show方法几乎相同。这两种方法都用于根据其ID检索单个对象并将其显示在页面上。唯一的区别是show方法不可编辑。
def edit
@book = Book.find(params[:id])
@subjects = Subject.all
end
将调用此方法以在屏幕上显示要由用户修改的数据。第二行从数据库中获取所有主题,并将它们放入名为@subjects的数组中。
当用户修改数据并希望将更改更新到数据库时,将在edit方法之后调用此方法。 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行,如果它不能成功保存数据,则需要它,然后它变得类似于edit选项。
如果要从数据库中删除记录,则将使用此方法。实施此方法如下。
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)。