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 мы предоставили собственное сообщение.

Здесь мы пытаемся увеличить заголовок при редактировании существующей записи. Он выдает следующее сообщение об ошибке только потому, что мы добавили вышеуказанные проверки -

Чем отличаются строительные леса?

Если вы прошли через предыдущие главы, значит, вы, должно быть, видели, что мы создали методы для перечисления, отображения, удаления и создания данных, но скаффолдинг выполняет эту работу автоматически.