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

廣告
© . All rights reserved.