Ruby on Rails 2.1-스캐 폴딩

Rails 애플리케이션, 특히 데이터베이스의 데이터에 대한 간단한 인터페이스를 주로 제공하는 애플리케이션을 개발하는 동안 scaffold 메서드를 사용하는 것이 유용 할 수 있습니다.

Scaffolding은 저렴한 데모 스릴 이상을 제공합니다. 다음은 몇 가지 이점입니다.

  • 피드백을 위해 사용자 앞에서 코드를 빠르게 얻을 수 있습니다.

  • 더 빠른 성공에 동기가 부여됩니다.

  • 생성 된 코드를 보면 Rails의 작동 방식을 알 수 있습니다.

  • 스캐 폴딩을 기초로 사용하여 개발을 시작할 수 있습니다.

비계 예

Ruby on Rails 2.0은 Rails가 스캐 폴딩을 사용하는 방식을 변경합니다. scaffolding 을 이해하기 위해 라는 데이터베이스를 만들어 보겠습니다.cookbook 그리고라는 테이블 recipes. −

빈 Rails 웹 애플리케이션 생성

명령 창을 열고 만들려는 위치로 이동합니다. cookbook웹 애플리케이션. c : \ ruby를 사용했습니다. 다음 명령을 실행하여 전체 디렉터리 구조와 필수 .yml 파일 MySQL 데이터베이스를 만듭니다.

C:\ruby> rails -d mysql cookbook

여기서 우리는 -d mysqlMySQL 데이터베이스 사용에 대한 관심을 지정하는 옵션입니다. 우리는 같은 다른 데이터베이스 이름을 지정할 수 있습니다 신탁 또는 위해 Postgress을 사용하여-d선택권. 기본적으로 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

NOTE − MySQL을 제외한 다른 데이터베이스를 사용하려는 경우 다른 데이터베이스 어댑터에 대해 유사한 설정을 사용할 수 있습니다.

Rails를 사용하면 다른 데이터베이스를 사용하여 개발 모드, 테스트 모드 또는 프로덕션 모드에서 실행할 수 있습니다. 이 응용 프로그램은 각각에 대해 동일한 데이터베이스를 사용합니다.

데이터베이스 테이블 정의

다음 구조를 가정합니다. recipes 표 −

id INT(11) 
title VARCHAR(40)
chef VARCHAR(40)
instructions VARCHAR(255)

생성 된 스캐 폴드 코드

으로 비계 작업, 레일은 동적으로 필요로하는 모든 코드를 생성합니다. scaffold 를 스크립트로 실행 하여 다음과 같이 모델, scaffolding 및 필요한 데이터베이스 마이그레이션 스크립트와 컨트롤러, 도우미 및 테스트 지원 파일을 생성합니다.

cookbook> ruby script/generate scaffold Recipe title:string \
chef:string instructions:text

복수 테이블 이름 recipes 를 생성하려면 단수 이름 Recipe 를 확인하세요 . 그러나 위의 명령은 다음 메시지를 생성합니다.

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/index.html.erb
   create  app/views/recipes/show.html.erb
   create  app/views/recipes/new.html.erb
   create  app/views/recipes/edit.html.erb
   create  app/views/layouts/recipes.html.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|
         format.html # index.html.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|
         format.html # show.html.erb
         format.xml  { render :xml => @recipe }
      end
   end

   # GET /recipes/new
   # GET /recipes/new.xml
   def new
      @recipe = Recipe.new

      respond_to do |format|
         format.html # new.html.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.'
         format.html { redirect_to(@recipe) }
         format.xml  { render :xml => 
            @recipe, :status => :created, :location => @recipe }
      else
         format.html { 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.'
         format.html { redirect_to(@recipe) }
         format.xml  { head :ok }
      else
         format.html { 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|
         format.html { redirect_to(recipes_url) }
         format.xml  { head :ok }
      end
   end
end

이 파일에는 모든 메소드가 자동으로 구현됩니다. 이러한 사용 가능한 방법을 사용하여 모든 만들기, 읽기, 삭제 또는 편집 작업을 수행 할 수 있습니다.

Rails 애플리케이션 사용자가 "Show"와 같은 작업을 선택하면 컨트롤러는 해당 섹션의 모든 코드를 실행합니다- "def show"-그런 다음 기본적으로 동일한 이름의 템플릿을 렌더링합니다- "show.html .erb ". 이 기본 동작은 템플릿의 코드를 덮어 쓰면 덮어 쓸 수 있습니다. −

컨트롤러는 find, find_all, new, save, update_attributes 및 destroy 와 같은 ActiveRecord 메소드를 사용 하여 데이터베이스 테이블 간에 데이터를 이동합니다. SQL 문을 작성할 필요는 없으며 Rails가 자동으로 처리합니다.

관점들

모든 뷰와 해당 컨트롤러 메서드는 scaffold명령이며 app / views / recipes 디렉토리에서 사용할 수 있습니다. 이 디렉토리에는 다음 파일이 있습니다.

  • index.html.erb − 기본 페이지를 보여주는 템플릿 파일로 http://127.0.0.1:3000/recipes를 입력하면 실행됩니다.

  • new.html.erb − 이것은 새 레시피를 생성하기위한 템플릿이며 새 레시피를 생성하려고 할 때마다 실행됩니다.

  • show.html.erb − 데이터베이스의 모든 레시피를 표시하는 템플릿으로 모든 레시피를 보려고 할 때마다 실행됩니다.

  • edit.html.erb − 이것은 데이터베이스의 레시피를 편집하기위한 템플릿이며 레시피를 편집하려고 할 때마다 실행됩니다.

이러한 파일을 하나씩 열고 소스 코드를 이해하는 것이 좋습니다.

마이그레이션

생성 된 마이그레이션 파일은 ~/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

이 명령은 recipesschema_migrations 당신의 테이블 cookbook데이터 베이스. 계속하기 전에 필요한 테이블이 데이터베이스에 성공적으로 생성되었는지 확인하십시오.

테스트 준비

위의 모든 단계는 데이터베이스 테이블에 생명을 불어 넣습니다. 그것은 당신의 데이터에 대한 간단한 인터페이스를 제공하고-

  • 새 항목 만들기
  • 현재 항목 편집
  • 현재 항목보기
  • 현재 항목 삭제

항목을 만들거나 편집 할 때 scaffold는 양식 생성 및 처리의 모든 노력을 다합니다. 다음 유형의 입력을 지원하는 영리한 양식 생성도 제공합니다.

  • 간단한 텍스트 문자열
  • 텍스트 영역 (또는 큰 텍스트 블록)
  • 날짜 선택기
  • 날짜-시간 선택기

이제 cookbook 디렉토리로 이동하여 다음 명령을 사용하여 웹 서버를 실행하십시오.

cookbook> ruby script/server

이제 브라우저를 열고 http://127.0.0.1:3000/recipes/new로 이동합니다. 레시피 테이블에 새 항목을 생성하는 화면을 제공합니다. 스크린 샷은 아래와 같습니다.

이제 주어진 텍스트 상자에 몇 가지 값을 입력하고 만들기 버튼을 눌러 새 레시피를 만듭니다. 기록이 레시피 테이블에 추가되고 다음 결과가 표시됩니다.

다음 중 하나를 사용할 수 있습니다. Edit 레시피를 편집하거나 Back버튼을 눌러 이전 페이지로 이동합니다. 당신이 눌렀다 고 가정하면Back버튼을 누르면 데이터베이스에서 사용 가능한 모든 레시피가 표시됩니다. 데이터베이스에는 레코드가 하나뿐이므로 다음 화면이 표시됩니다.

이 화면은 레시피 테이블의 전체 세부 사항을 볼 수있는 옵션을 제공합니다. 또한 테이블을 편집하거나 삭제할 수있는 옵션을 제공합니다.

모델 향상

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 오류 메시지 대신 사용자 지정 메시지를 제공했습니다.

여기서는 기존 레코드를 편집하는 동안 더 큰 제목을 제공하려고합니다. 위의 유효성 검사를 추가했기 때문에 다음과 같은 오류 메시지가 생성됩니다.

비계는 어떻게 다른가요?

이전 장을 살펴 보셨다면 데이터를 나열, 표시, 삭제 및 생성하는 메서드를 만들었지 만 스캐 폴딩이 해당 작업을 자동으로 수행한다는 사실을 확인했을 것입니다.