Rails控制器是應用程式的邏輯中心。它協調用戶、視圖和模型之間的交互。管制員也是許多重要輔助服務的所在地。
它負責將外部請求路由到內部操作。它非常好地處理人們友好的網址。
它管理緩存,這可以給應用程式帶來數量級的性能提升。
它管理helper模塊,這些模塊擴展了視圖模板的功能,而不會增加它們的代碼。
它管理會話,給用戶留下與我們的應用程式進行交互的印象。
創建控制器的過程非常簡單,它與我們已經用於創建模型的過程類似。我們在這裡只創建一個控制器;
library\> rails generate controller Book
注意,你是大寫的書和使用單數形式。這是一個Rails範例,每次創建控制器時都應該遵循它。
這個命令完成了幾個任務,其中與此相關的是&負;
它創建一個名爲app/controllers/book_controller.rb的文件
如果您查看book_controller.rb,您會發現它如下所示;
class BookController < ApplicationController end
控制器類繼承自application Controller,這是controllers文件夾中的另一個文件:application.rb。
ApplicationController包含可以在所有控制器中運行的代碼,它繼承自RailsActionController::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
現在讓我們逐一實現所有方法。
Implementing the list Method
list方法提供資料庫中所有書籍的列表。此功能將通過以下代碼行實現。在book_controller.rb文件中編輯以下行。
def list @books = Book.all end
list方法中的@books=Book.all行告訴Rails搜索books表並將找到的每一行存儲在@books實例對象中。
Implementing the show Method
show方法僅顯示一本書的更多詳細信息。此功能將通過以下代碼行實現。
def show @book = Book.find(params[:id]) end
show方法的@book=book.find(params[:id])行告訴Rails只查找在params[:id]中定義了id的圖書。
params對象是允許在方法調用之間傳遞值的容器。例如,當您在list方法調用的頁面上時,可以單擊特定圖書的連結,它通過params對象傳遞圖書的id,這樣show就可以找到特定的圖書。
Implementing the new Method
新方法讓Rails知道您將創建一個新對象。所以只需在這個方法中添加以下代碼。
def new @book = Book.new @subjects = Subject.all end
當您向用戶顯示一個頁面以接受用戶輸入時,將調用上述方法。在這裡,第二行從資料庫中獲取所有主題,並將它們放入一個名爲@subjects的數組中。
Implementing the create Method
一旦您使用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是必需的,以防它無法成功保存數據,並且變得與新選項類似。
Implementing the edit Method
edit方法看起來與show方法幾乎相同。這兩種方法都用於根據單個對象的id檢索該對象並將其顯示在頁面上。唯一的區別是show方法不可編輯。
def edit @book = Book.find(params[:id]) @subjects = Subject.all end
將調用此方法以在螢幕上顯示要由用戶修改的數據。第二行從資料庫中獲取所有主題,並將它們放入一個名爲@subjects的數組中。
Implementing the update Method
當用戶修改數據並希望將更改更新到資料庫中時,將在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選項。
Implementing the delete Method
如果要從資料庫中刪除記錄,則將使用此方法。按如下方式實現此方法。
def delete Book.find(params[:id]).destroy redirect_to :action => 'list' end
第一行根據通過params對象傳遞的參數查找分類,然後使用destroy方法刪除它。第二行使用redirect_to call將用戶重定向到list方法。
Additional Methods to Display Subjects
假設你想給你的用戶一個基於給定主題的瀏覽所有書籍的工具。因此,可以在book_controller.rb中創建一個方法來顯示所有主題。假設方法名爲顯示主題−
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
現在保存控制器文件。
What is Next?
您已經創建了幾乎所有的方法,這些方法將在後端工作。接下來,我們將爲操作定義路由(url)。