Ruby on Rails 2.1 - Строительные леса
Пока вы разрабатываете приложения Rails, особенно те, которые в основном предоставляют вам простой интерфейс для данных в базе данных, часто может быть полезно использовать метод scaffold.
Строительные леса доставляют больше, чем просто удовольствие от демонстрации. Вот некоторые преимущества -
Вы можете быстро предоставить код пользователям для обратной связи.
Вас мотивирует более быстрый успех.
Вы можете узнать, как работает Rails, посмотрев на сгенерированный код.
Вы можете использовать строительные леса как основу, чтобы дать толчок развитию.
Пример строительных лесов
Ruby on Rails 2.0 меняет способ использования каркасов в Rails. Чтобы понять , что такое скаффолдинг , давайте создадим базу данных под названиемcookbook и таблица называется recipes. -
Создание пустого веб-приложения на Rails
Откройте командное окно и перейдите туда, где вы хотите создать это cookbookвеб приложение. Мы использовали c: \ ruby. Выполните следующую команду, чтобы создать полную структуру каталогов и необходимую базу данных MySQL с файлом .yml .
C:\ruby> rails -d mysql cookbook
Здесь мы используем -d mysqlвозможность указать нашу заинтересованность в использовании базы данных MySQL. Мы можем указать любое другое имя базы данных, например oracle или 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 Rails генерирует весь необходимый код динамически. Запустив скаффолд в качестве скрипта, сгенерируйте модель, а также скаффолдинг и необходимый скрипт миграции базы данных, а также файлы поддержки контроллера, помощника и тестирования следующим образом:
cookbook> ruby script/generate scaffold Recipe title:string \
chef:string instructions:text
Обратите внимание на единственное имя Рецепт для создания множественного числа имен таблицы рецептов . Однако приведенная выше команда сгенерирует следующие сообщения -
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 выбирает действие, например, «Показать» - контроллер выполнит любой код в соответствующем разделе - «def show», а затем по умолчанию отобразит шаблон с тем же именем - «show.html». .erb ". Это поведение по умолчанию может быть изменено путем перезаписи кода в любом шаблоне. -
Контроллер использует методы ActiveRecord, такие как find, find_all, new, save, update_attributes и destroy для перемещения данных в таблицы базы данных и из них. Обратите внимание, что вам не нужно писать никаких операторов 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> 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 мы предоставили собственное сообщение.
Здесь мы пытаемся увеличить заголовок при редактировании существующей записи. Он выдает следующее сообщение об ошибке только потому, что мы добавили вышеуказанные проверки -
Чем отличаются строительные леса?
Если вы прошли через предыдущие главы, значит, вы, должно быть, видели, что мы создали методы для перечисления, отображения, удаления и создания данных, но скаффолдинг выполняет эту работу автоматически.