Учебники

Ruby on Rails 2.1 — строительные леса

Пока вы разрабатываете 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 выполняет эту работу автоматически.