- 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)。