Пока вы разрабатываете Rails-приложения, особенно те, которые в основном предоставляют вам простой интерфейс для данных в базе данных, часто бывает полезно использовать метод scaffold.
Леса предоставляют больше, чем дешевые демонстрационные ощущения. Вот некоторые преимущества —
-
Вы можете быстро получить код перед своими пользователями для обратной связи.
-
Вы мотивированы более быстрым успехом.
-
Вы можете узнать, как работает Rails, взглянув на сгенерированный код.
-
Вы можете использовать леса в качестве основы для запуска вашего развития.
Вы можете быстро получить код перед своими пользователями для обратной связи.
Вы мотивированы более быстрым успехом.
Вы можете узнать, как работает Rails, взглянув на сгенерированный код.
Вы можете использовать леса в качестве основы для запуска вашего развития.
Пример строительных лесов
Ruby on Rails 2.0 меняет способ, которым Rails использует скаффолдинг. Чтобы понять леса , давайте создадим базу данных с именем cookbook и таблицу с названием recipes . —
Создание пустого веб-приложения Rails
Откройте командное окно и перейдите к месту, где вы хотите создать это веб-приложение кулинарной книги . Мы использовали c: \ ruby. Выполните следующую команду, чтобы создать полную структуру каталогов и требуемый .yml файл базы данных MySQL.
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
ПРИМЕЧАНИЕ. — Вы можете использовать аналогичные настройки для других адаптеров базы данных, если хотите использовать любую другую базу данных, кроме MySQL.
Rails позволяет вам работать в режиме разработки, тестовом или производственном режиме, используя разные базы данных. Это приложение использует одну и ту же базу данных для каждого.
Определение таблицы базы данных
Предполагая следующую структуру для нашей таблицы рецептов —
id INT(11) title VARCHAR(40) chef VARCHAR(40) instructions VARCHAR(255)
Сгенерированный код лесов
С помощью действия scaffold Rails генерирует весь необходимый код динамически. Запустив scaffold в качестве сценария, сгенерируйте модель, а также scaffolding и необходимый сценарий миграции базы данных, а также файлы поддержки контроллера, помощника и тестирования следующим образом:
cookbook> ruby script/generate scaffold Recipe title:string \ chef:string instructions:text
Обратите внимание на единственное имя 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>
Теперь давайте рассмотрим, что произошло за сценой.
Контроллер
Давайте посмотрим на код за контроллером. Этот код генерируется генератором скаффолдов . Если вы откроете 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
В этом файле все методы реализованы автоматически. Вы можете выполнить любую операцию Create, Read, Delete или Edit, используя эти доступные методы.
Когда пользователь приложения 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 — это шаблон для редактирования любого рецепта в вашей базе данных, который будет выполняться всякий раз, когда вы пытаетесь редактировать любой рецепт.
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
Эта команда создаст рецепты и таблицы schema_migrations в вашей базе данных поваренной книги . Прежде чем продолжить, убедитесь, что в вашей базе данных успешно создана необходимая таблица.
Готов к тестированию
Все вышеперечисленные шаги оживляют вашу таблицу базы данных. Он предоставляет простой интерфейс для ваших данных и способы —
- Создание новых записей
- Редактирование текущих записей
- Просмотр текущих записей
- Уничтожение текущих записей
При создании или редактировании записи scaffold будет выполнять всю тяжелую работу по генерации и обработке форм. Это даже обеспечит умную генерацию форм, поддерживая следующие типы входов —
- Простые текстовые строки
- Текстовые области (или большие блоки текста)
- Селекторы даты
- Селекторы даты и времени
Теперь перейдите в каталог поваренной книги и запустите веб-сервер, используя следующую команду —
cookbook> ruby script/server
Теперь откройте браузер и перейдите по адресу http://127.0.0.1:3000/recipes/new. Он предоставит вам экран для создания новых записей в таблице рецептов. Скриншот показан ниже —
Теперь введите некоторые значения в указанные текстовые поля и нажмите кнопку «Создать», чтобы создать новый рецепт. Ваша запись добавляется в таблицу рецептов и показывает следующий результат —
Вы можете использовать либо опцию Изменить, чтобы редактировать рецепт, либо кнопку Назад , чтобы перейти на предыдущую страницу. Предполагая, что вы нажали кнопку « Назад» , он отобразит все рецепты, доступные в вашей базе данных. Поскольку у нас есть только одна запись в нашей базе данных, она покажет вам следующий экран —
Этот экран дает вам возможность увидеть полную информацию о таблице рецептов. Кроме того, он предоставляет опции для редактирования или даже удаления таблицы.
Улучшение модели
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 по умолчанию мы дали наше собственное сообщение.
validates_length_of — поле не пустое и не слишком длинное.
validates_uniqueness_of — повторяющиеся значения перехвачены. Вместо сообщения об ошибке Rails по умолчанию мы дали наше собственное сообщение.
Здесь мы пытаемся предоставить больший заголовок при редактировании выходящей записи. Он выдает следующее сообщение об ошибке только потому, что мы добавили вышеупомянутые проверки —
Чем отличаются строительные леса?
Если вы прошли предыдущие главы, значит, вы уже видели, что мы создали методы для вывода, отображения, удаления и создания данных, но scaffolding выполняет эту работу автоматически.