Ruby-on-rails-2.1-rails-scaffolding
Ruby on Rails 2.1-足場
Railsアプリケーション、特にデータベース内のデータへのシンプルなインターフェイスを主に提供しているアプリケーションを開発している場合、scaffoldメソッドを使用すると便利な場合があります。
足場は、安価なデモスリル以上のものを提供します。 ここにいくつかの利点があります-
- フィードバックのために、ユーザーの前でコードをすばやく取得できます。
- あなたはより速い成功によって動機づけられます。
- 生成されたコードを見ると、Railsの仕組みを学ぶことができます。
- 足場を基盤として使用して、開発を開始できます。
足場の例
Ruby on Rails 2.0は、Railsがscaffoldingを使用する方法を変更します。 _scaffolding_を理解するために、 cookbook というデータベースと recipes というテーブルを作成してみましょう。 −
空のRails Webアプリケーションを作成する
コマンドウィンドウを開き、この cookbook Webアプリケーションを作成する場所に移動します。 c:\ rubyを使用しました。 次のコマンドを実行して、完全なディレクトリ構造と必要な_.yml_ファイルMySQLデータベースを作成します。
C:\ruby> rails -d mysql cookbook
ここでは、-d mysql *オプションを使用して、MySQLデータベースを使用する関心を指定しています。 *-d オプションを使用して、_oracle_や_postgress_などの他のデータベース名を指定できます。 デフォルトでは、Railsは SQLite データベースを使用します。
データベースのセットアップ
データベースを作成する方法は次のとおりです-
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
encoding: utf8
database: cookbook
username: root
password: password
host: localhost
test:
adapter: mysql
encoding: utf8
database: cookbook
username: root
password: password
host: localhost
production:
adapter: mysql
encoding: utf8
database: cookbook
username: root
password: password
host: localhost
注-MySQL以外の他のデータベースを使用する場合は、他のデータベースアダプターに同様の設定を使用できます。
Railsでは、異なるデータベースを使用して、開発モード、テストモード、または運用モードで実行できます。 このアプリケーションは、それぞれに同じデータベースを使用します。
データベーステーブルの定義
私たちの recipes テーブルに次の構造を仮定します-
id INT(11)
title VARCHAR(40)
chef VARCHAR(40)
instructions VARCHAR(255)
生成された足場コード
_scaffold_アクションを使用すると、Railsは必要なすべてのコードを動的に生成します。 _scaffold_をスクリプトとして実行することにより、モデル、足場、必要なデータベース移行スクリプト、コントローラー、ヘルパー、テストサポートファイルを次のように生成します-
cookbook> ruby script/generate scaffold Recipe title:string \
chef:string instructions:text
単数の名前_Recipe_に注意して、複数のテーブル名_recipes_を作成します。 ただし、上記のコマンドは次のメッセージを生成します-
exists app/models/
exists app/controllers/
exists app/helpers/
create app/views/recipes
exists app/views/layouts/
exists test/functional/
exists test/unit/
exists public/stylesheets/
create app/views/recipes/indexl.erb
create app/views/recipes/showl.erb
create app/views/recipes/newl.erb
create app/views/recipes/editl.erb
create app/views/layouts/recipesl.erb
create public/stylesheets/scaffold.css
create app/controllers/recipes_controller.rb
create test/functional/recipes_controller_test.rb
create app/helpers/recipes_helper.rb
route map.resources :recipes
dependency model
exists app/models/
exists test/unit/
exists test/fixtures/
create app/models/recipe.rb
create test/unit/recipe_test.rb
create test/fixtures/recipes.yml
create db/migrate
create db/migrate/20080614192220_create_recipes.rb
cookbook>
それでは、舞台裏で何が起こったのかを見てみましょう。
コントローラー
コントローラーの背後にあるコードを見てみましょう。 このコードは、 scaffold ジェネレーターによって生成されます。 app/controllers/recipes_controller.rbを開くと、次のようなものが見つかります-
class RecipesController < ApplicationController
# GET/recipes
# GET/recipes.xml
def index
@recipes = Recipe.find(:all)
respond_to do |format|
formatl # indexl.erb
format.xml { render :xml => @recipes }
end
end
# GET/recipes/1
# GET/recipes/1.xml
def show
@recipe = Recipe.find(params[:id])
respond_to do |format|
formatl # showl.erb
format.xml { render :xml => @recipe }
end
end
# GET/recipes/new
# GET/recipes/new.xml
def new
@recipe = Recipe.new
respond_to do |format|
formatl # newl.erb
format.xml { render :xml => @recipe }
end
end
# GET/recipes/1/edit
def edit
@recipe = Recipe.find(params[:id])
end
# POST/recipes
# POST/recipes.xml
def create
@recipe = Recipe.new(params[:recipe])
respond_to do |format|
if @recipe.save
flash[:notice] = 'Recipe was successfully created.'
formatl { redirect_to(@recipe) }
format.xml { render :xml =>
@recipe, :status => :created, :location => @recipe }
else
formatl { render :action => "new" }
format.xml { render :xml =>
@recipe.errors, :status => :unprocessable_entity }
end
end
end
# PUT/recipes/1
# PUT/recipes/1.xml
def update
@recipe = Recipe.find(params[:id])
respond_to do |format|
if @recipe.update_attributes(params[:recipe])
flash[:notice] = 'Recipe was successfully updated.'
formatl { redirect_to(@recipe) }
format.xml { head :ok }
else
formatl { render :action => "edit" }
format.xml { render :xml => @recipe.errors,
:status => :unprocessable_entity }
end
end
# DELETE/recipes/1
# DELETE/recipes/1.xml
def destroy
@recipe = Recipe.find(params[:id])
@recipe.destroy
respond_to do |format|
formatl { redirect_to(recipes_url) }
format.xml { head :ok }
end
end
end
このファイルには、すべてのメソッドが自動的に実装されています。 これらの使用可能な方法を使用して、作成、読み取り、削除、または編集操作を実行できます。
Railsアプリケーションのユーザーが "Show"などのアクションを選択すると、コントローラーは適切なセクションのコードを実行します-"def show"-そしてデフォルトで同じ名前のテンプレートをレンダリングします-"showl.erb 」 このデフォルトの動作は、テンプレートのコードを上書きすることで上書きできます。 −
コントローラーは、_find、find_all、new、save、update_attributes、destroy_などのActiveRecordメソッドを使用して、データベーステーブルとの間でデータを移動します。 SQLステートメントを記述する必要はありません。Railsが自動的に処理します。
ビュー
すべてのビューと対応するコントローラーメソッドは scaffold コマンドによって作成され、app/views/recipesディレクトリで使用できます。 このディレクトリに次のファイルがあります-
- indexl.erb -これはデフォルトのページを表示するためのテンプレートファイルで、http://127.0.0.1:3000/recipesと入力すると実行されます。
- newl.erb -これは新しいレシピを作成するためのテンプレートであり、新しいレシピを作成しようとするたびに実行されます。
- showl.erb -これは、データベース内のすべてのレシピを表示するテンプレートであり、すべてのレシピを表示しようとするたびに実行されます。
- editl.erb -これは、データベース内のレシピを編集するためのテンプレートであり、レシピを編集しようとするたびに実行されます。
これらのファイルを1つずつ開き、ソースコードを理解することをお勧めします。
移行
- 〜/cookbook/db/migrate *サブディレクトリに作成された移行ファイルがあります。 このファイルには次の内容が含まれます-
class CreateRecipes < ActiveRecord::Migration
def self.up
create_table :recipes do |t|
t.string :title
t.string :chef
t.text :instructions
t.timestamps
end
end
def self.down
drop_table :recipes
end
end
データベースに必要なファイルを作成するには、次のようにヘルパースクリプトを使用します。
cookbook> rake db:migrate
このコマンドは、 cookbook データベースに recipes および schema_migrations テーブルを作成します。 先に進む前に、データベースに必要なテーブルが正常に作成されていることを確認してください。
テストする準備ができて
上記のすべての手順により、データベーステーブルに命が吹き込まれます。 それはあなたのデータへのシンプルなインターフェースと方法を提供します-
- 新しいエントリを作成する
- 現在のエントリを編集する
- 現在のエントリを表示する
- 現在のエントリを破棄する
エントリを作成または編集するとき、scaffoldはフォームの生成と処理のすべてのハードワークを行います。 次のタイプの入力をサポートする、巧妙なフォーム生成も提供します-
- 単純なテキスト文字列
- テキスト領域(またはテキストの大きなブロック)
- 日付セレクター *日時セレクター
今、クックブックのディレクトリに移動し、次のコマンドを使用してWebサーバーを実行します-
cookbook> ruby script/server
次に、ブラウザを開いてhttp://127.0.0.1:3000/recipes/newに移動します。 レシピテーブルに新しいエントリを作成する画面が表示されます。 スクリーンショットを以下に示します-
次に、指定されたテキストボックスに値を入力し、[作成]ボタンを押して新しいレシピを作成します。 あなたの記録は、レシピ表に追加され、それは次の結果を示しています-
[編集]オプションを使用してレシピを編集するか、[戻る]ボタンを使用して前のページに移動できます。* Back *ボタンを押したとすると、データベースで利用可能なすべてのレシピが表示されます。 データベースにはレコードが1つしかないため、次の画面が表示されます-
この画面には、レシピテーブルの完全な詳細を表示するオプションがあります。 さらに、テーブルを編集または削除するオプションも提供します。
モデルの強化
Railsは、多くのエラー処理を無料で提供します。 これを理解するには、空のレシピモデルにいくつかの検証ルールを追加します-
次のように*〜/cookbook/app/models/recipe.rb *を変更し、アプリケーションをテストします-
class Recipe < ActiveRecord::Base
validates_length_of :title, :within => 1..20
validates_uniqueness_of :title, :message => "already exists"
end
これらのエントリは、次のような自動チェックを提供します-
- validates_length_of -フィールドは空白ではなく、長すぎません。
- validates_uniqueness_of -重複する値はトラップされます。 デフォルトのRailsエラーメッセージの代わりに、カスタムメッセージを指定しました。
ここでは、既存のレコードの編集中に、より大きなタイトルを提供しようとしています。 上記の検証を追加したという理由だけで、次のエラーメッセージが生成されます-
足場の違いは何ですか?
前の章を読んだことがある方は、データをリスト、表示、削除、作成するメソッドが作成されているのをご覧になったはずですが、scaffoldingはその仕事を自動的に行います。