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
이 명령은 recipes 과 schema_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 오류 메시지 대신 사용자 지정 메시지를 제공했습니다.
여기서는 기존 레코드를 편집하는 동안 더 큰 제목을 제공하려고합니다. 위의 유효성 검사를 추가했기 때문에 다음과 같은 오류 메시지가 생성됩니다.
비계는 어떻게 다른가요?
이전 장을 살펴 보셨다면 데이터를 나열, 표시, 삭제 및 생성하는 메서드를 만들었지 만 스캐 폴딩이 해당 작업을 자동으로 수행한다는 사실을 확인했을 것입니다.