Ruby-on-rails-2.1-rails-scaffolding

提供:Dev Guides
移動先:案内検索

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はその仕事を自動的に行います。