- 學習 Ruby on Rails
- Rails 2.1 首頁
- Rails 2.1 簡介
- Rails 2.1 安裝
- Rails 2.1 框架
- Rails 2.1 目錄結構
- Rails 2.1 示例
- Rails 2.1 資料庫設定
- Rails 2.1 Active Records
- Rails 2.1 遷移
- Rails 2.1 控制器
- Rails 2.1 檢視
- Rails 2.1 佈局
- Rails 2.1 腳手架
- Rails 2.1 和 AJAX
- Rails 2.1 上傳檔案
- Rails 2.1 傳送郵件
- 高階 Ruby on Rails 2.1
- Rails 2.1 RMagick 指南
- Rails 2.1 基本 HTTP 認證
- Rails 2.1 錯誤處理
- Rails 2.1 路由系統
- Rails 2.1 單元測試
- 高階 Ruby on Rails 2.1
- Rails 2.1 提示與技巧
- 快速參考指南
- 快速參考指南
- Ruby on Rails 2.1 有用資源
- Ruby on Rails 2.1 - 資源
- Ruby on Rails 2.1 - 討論
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
現在,儲存您的控制器檔案並退出以進行下一個任務。
接下來是什麼?
您已經建立了幾乎所有將在後端工作的方法。接下來,我們將建立程式碼以生成螢幕以顯示資料並從使用者那裡獲取輸入。