當您開發Rails應用程式時,特別是那些主要爲您提供資料庫中數據的簡單接口的應用程式,使用scaffold方法通常會很有用。
腳手架提供的不僅僅是廉價的演示刺激。這裡有一些好處;
您可以在用戶面前快速獲取代碼以獲得反饋。
你的動力來自更快的成功。
通過查看生成的代碼,您可以了解Rails是如何工作的。
你可以用腳手架作爲基礎來開始你的開發。
Scaffolding Example
爲了理解scaffolding,讓我們創建一個名爲cookbook的資料庫和一個名爲recipes的表。
Creating an Empty Rails Web Application
打開一個命令窗口並導航到要創建這個cookbookweb應用程式的位置。因此,運行以下命令創建一個完整的目錄結構。
tp> rails new cookbook
Setting up the Database
下面是創建資料庫的方法−
mysql> create database cookbook; Query OK, 1 row affected (0.01 sec) mysql> grant all privileges on cookbook.* to 'root'@'localhost' identified by 'password'; Query OK, 0 rows affected (0.00 sec) mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec)
要指示Rails如何查找資料庫,請編輯配置文件cookbook\config\database.yml並將資料庫名稱更改爲cookbook。密碼爲空。當你完成的時候,它應該是這樣的;
development: adapter: mysql database: cookbook username: root password: [password] host: localhost test: adapter: mysql database: cookbook username: root password: [password] host: localhost production: adapter: mysql database: cookbook username: root password: [password] host: localhost
Rails允許您使用不同的資料庫在開發模式、測試模式或生產模式下運行。此應用程式對每個應用程式使用相同的資料庫。
The Generated Scaffold Code
通過scaffold操作,Rails動態地生成它需要的所有代碼。通過將scaffold作爲腳本運行,我們可以將所有代碼寫入磁碟,在那裡我們可以對其進行調查,然後開始根據我們的需求對其進行裁剪。
現在,讓我們再次開始使用Scaffold helper腳本手動生成Scaffold代碼;
cookbook> rails generate scaffold recipe
它生成如下所示的自動文件;
The Controller
讓我們看看控制器後面的代碼。此代碼由scaffold生成器生成。如果您打開app/controllers/recipes_controller.rb,您將發現以下內容&負;
class RecipesController < ApplicationController before_action :set_recipe, only: [:show, :edit, :update, :destroy] # GET /recipes # GET /recipes.json def index @recipes = Recipe.all end # GET /recipes/1 # GET /recipes/1.json def show end # GET /recipes/new def new @recipe = Recipe.new end # GET /recipes/1/edit def edit end # POST /recipes # POST /recipes.json def create @recipe = Recipe.new(recipe_params) respond_to do |format| if @recipe.save format.html { redirect_to @recipe, notice: 'Recipe was successfully created.' } format.json { render :show, status: :created, location: @recipe } else format.html { render :new } format.json { render json: @recipe.errors, status: :unprocessable_entity } end end end # PATCH/PUT /recipes/1 # PATCH/PUT /recipes/1.json def update respond_to do |format| if @recipe.update(recipe_params) format.html { redirect_to @recipe, notice: 'Recipe was successfully updated.' } format.json { render :show, status: :ok, location: @recipe } else format.html { render :edit } format.json { render json: @recipe.errors, status: :unprocessable_entity } end end end # DELETE /recipes/1 # DELETE /recipes/1.json def destroy @recipe.destroy respond_to do |format| format.html { redirect_to recipes_url, notice: 'Recipe was successfully destroyed.' } format.json { head :no_content } end end private # Use callbacks to share common setup or constraints between actions. def set_recipe @recipe = Recipe.find(params[:id]) end # Never trust parameters from the scary internet, only allow the white list through. def recipe_params params.require(:recipe).permit(:tittle, :instructions) end end
當Rails應用程式的用戶選擇一個操作時,例如「Show」,控制器將執行相應部分中的任何代碼-「def Show」,然後默認情況下將呈現一個同名的模板-「Show.html.erb」。可以覆蓋此默認行爲。
控制器使用ActiveRecord方法,例如find、find_all、new、save、update_attributes和destroy在資料庫表之間移動數據。注意,您不必編寫任何SQL語句,rails會自動處理它。
這一行代碼將激活資料庫表。它將爲您的數據提供一個簡單的接口,並提供-minus;
- Creating new entries
- Editing current entries
- Viewing current entries
- Destroying current entries
在創建或編輯條目時,scaffold將爲您完成所有的艱苦工作,如表單生成和處理,甚至將提供聰明的表單生成,支持以下類型的輸入−
- Simple text strings
- Text areas (or large blocks of text)
- Date selectors
- Date-time selectors
您可以使用Rails遷移來創建和維護表。
rake db:migrate RAILS_ENV=development
現在,轉到cookbook目錄並使用以下命令運行Web伺服器−
cookbook> rails server
現在,打開瀏覽器並導航到http://127.0.0.1:3000/recipe/new.這將爲您提供一個在recipes表中創建新條目的螢幕。螢幕截圖如下所示;
一旦您按下創建按鈕來創建一個新的配方,您的記錄將被添加到配方表中,並顯示以下結果−
您可以看到編輯、顯示和銷毀記錄的選項。所以,在這些選項上遊刃有餘。
還可以使用URL http://127.0.0.1:3000/recipe/list列出recipes表中可用的所有配方。
Enhancing the Model
Rails免費爲您提供很多錯誤處理。要理解這一點,請在空配方模型中添加一些驗證規則−
修改app/models/recipe.rb如下,然後測試您的應用程式&負;
class Recipe < ActiveRecord::Base validates_length_of :title, :within => 1..20 validates_uniqueness_of :title, :message => "already exists" end
這些條目將進行自動檢查。
驗證−的長度,該欄位不爲空且不太長。
驗證−重複值的唯一性是否被捕獲。我們在這裡提供了一個自定義消息,而不是默認的Rails錯誤消息。
Alternative Way to Create Scaffolding
如上圖所示創建一個應用程式,生成的Scaffold代碼如下所示
rails g scaffold Recipe tittle:string instructions:text
上面的代碼使用帶有標題和指令列的sqlite3生成帶有資料庫的自動文件,如下圖所示。
我們需要使用下面的語法遷移資料庫。
$ rake db:migrate RAILS_ENV=development
最後使用以下命令行運行應用程式−
rails server
它將生成上述輸出圖像所示的結果。
The Views
所有視圖和相應的所有控制器方法都是通過scaffold命令創建的,它們可以在app/views/recipes目錄中找到。
How Scaffolding is Different?
如果您已經閱讀了前面的章節,那麼您一定已經看到我們創建了列表、顯示、刪除和創建數據等方法,但是scaffolding會自動完成這項工作。