Пока вы разрабатываете Rails-приложения, особенно те, которые в основном предоставляют вам простой интерфейс для данных в базе данных, часто бывает полезно использовать метод scaffold.
Леса предоставляют больше, чем дешевые демонстрационные ощущения. Вот некоторые преимущества —
-
Вы можете быстро получить код перед своими пользователями для обратной связи.
-
Вы мотивированы более быстрым успехом.
-
Вы можете узнать, как работает Rails, взглянув на сгенерированный код.
-
Вы можете использовать строительные леса в качестве основы, чтобы начать разработку.
Вы можете быстро получить код перед своими пользователями для обратной связи.
Вы мотивированы более быстрым успехом.
Вы можете узнать, как работает Rails, взглянув на сгенерированный код.
Вы можете использовать строительные леса в качестве основы, чтобы начать разработку.
Пример строительных лесов
Чтобы понять леса, давайте создадим базу данных с именем cookbook и таблицу с названием recipes .
Создание пустого веб-приложения Rails
Откройте командное окно и перейдите к месту, где вы хотите создать это веб-приложение кулинарной книги . Итак, выполните следующую команду, чтобы создать полную структуру каталогов.
tp> rails new cookbook
Настройка базы данных
Вот способ создать базу данных —
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 database: cookbook username: root password: [password] host: localhost test: adapter: mysql database: cookbook username: root password: [password] host: localhost production: adapter: mysql database: cookbook username: root password: [password] host: localhost
Rails позволяет вам работать в режиме разработки, тестовом или производственном режиме, используя разные базы данных. Это приложение использует одну и ту же базу данных для каждого.
Сгенерированный код лесов
С помощью действия scaffold Rails генерирует весь необходимый код динамически. Запустив scaffold как скрипт, мы можем получить весь код, записанный на диск, где мы можем исследовать его и затем начать адаптировать его к нашим требованиям.
Итак, теперь давайте снова начнем генерировать код Scaffold вручную, используя вспомогательный скрипт scaffold —
cookbook> rails generate scaffold recipe
Он генерирует авто-файлы, как показано ниже —
Контроллер
Давайте посмотрим на код за контроллером. Этот код генерируется генератором скаффолдов . Если вы откроете app / controllers / recipes_controller.rb, то найдете следующее:
class RecipesController < ApplicationController before_action :set_recipe, only: [:show, :edit, :update, :destroy] # GET /recipes # GET /recipes.json def index @recipes = Recipe.all end # GET /recipes/1 # GET /recipes/1.json def show end # GET /recipes/new def new @recipe = Recipe.new end # GET /recipes/1/edit def edit end # POST /recipes # POST /recipes.json def create @recipe = Recipe.new(recipe_params) respond_to do |format| if @recipe.save format.html { redirect_to @recipe, notice: 'Recipe was successfully created.' } format.json { render :show, status: :created, location: @recipe } else format.html { render :new } format.json { render json: @recipe.errors, status: :unprocessable_entity } end end end # PATCH/PUT /recipes/1 # PATCH/PUT /recipes/1.json def update respond_to do |format| if @recipe.update(recipe_params) format.html { redirect_to @recipe, notice: 'Recipe was successfully updated.' } format.json { render :show, status: :ok, location: @recipe } else format.html { render :edit } format.json { render json: @recipe.errors, status: :unprocessable_entity } end end end # DELETE /recipes/1 # DELETE /recipes/1.json def destroy @recipe.destroy respond_to do |format| format.html { redirect_to recipes_url, notice: 'Recipe was successfully destroyed.' } format.json { head :no_content } end end private # Use callbacks to share common setup or constraints between actions. def set_recipe @recipe = Recipe.find(params[:id]) end # Never trust parameters from the scary internet, only allow the white list through. def recipe_params params.require(:recipe).permit(:tittle, :instructions) end end
Когда пользователь приложения Rails выбирает действие, например «Показать», контроллер выполнит любой код в соответствующем разделе — «def show» — и затем по умолчанию отобразит шаблон с тем же именем — «show.html». Еврорадио». Это поведение по умолчанию может быть перезаписано.
Контроллер использует методы ActiveRecord, такие как find, find_all, new, save, update_attributes и destroy для перемещения данных в таблицы базы данных и из них. Обратите внимание, что вам не нужно писать какие-либо операторы SQL, rails позаботится об этом автоматически.
Эта единственная строка кода оживит таблицу базы данных. Это обеспечит простой интерфейс для ваших данных и способы —
- Создание новых записей
- Редактирование текущих записей
- Просмотр текущих записей
- Уничтожение текущих записей
При создании или редактировании записи scaffold будет выполнять за вас всю тяжелую работу, такую как генерация и обработка форм, и даже обеспечит умную генерацию форм, поддерживая следующие типы входных данных:
- Простые текстовые строки
- Текстовые области (или большие блоки текста)
- Селекторы даты
- Селекторы даты и времени
Вы можете использовать Rails Migrations для создания и обслуживания таблиц.
rake db:migrate RAILS_ENV=development
Теперь перейдите в каталог поваренной книги и запустите веб-сервер, используя следующую команду:
cookbook> rails server
Теперь откройте браузер и перейдите по адресу http://127.0.0.1:3000/recipe/new. Это предоставит вам экран для создания новых записей в таблице рецептов. Скриншот показан ниже —
После того, как вы нажмете кнопку « Создать» , чтобы создать новый рецепт, ваша запись будет добавлена в таблицу рецептов, и на ней будет показан следующий результат:
Вы можете увидеть возможность редактировать, показывать и уничтожать записи. Итак, поиграйтесь с этими опциями.
Вы также можете перечислить все рецепты, доступные в таблице рецептов, используя URL-адрес http://127.0.0.1:3000/recipe/list.
Улучшение модели
Rails дает вам много обработки ошибок бесплатно. Чтобы понять это, добавьте некоторые правила проверки в пустую модель рецепта —
Измените 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 по умолчанию мы дали здесь собственное сообщение.
Альтернативный способ создания лесов
Создайте приложение, как показано выше, и сгенерированный код скаффолда, как показано ниже.
rails g scaffold Recipe tittle:string instructions:text
Приведенный выше код генерирует автоматические файлы с базой данных с использованием sqlite3 с заголовком и столбцом инструкций, как показано под изображением.
нам нужно перенести базу данных, используя приведенный ниже синтаксис.
$ rake db:migrate RAILS_ENV=development
Наконец, запустите приложение, используя следующую командную строку —
rails server
Результат будет сгенерирован так, как показано на рисунке выше.
Виды
Все представления и соответствующие им методы контроллера создаются командой scaffold, и они доступны в каталоге app / views / recipes.
Чем отличаются строительные леса?
Если вы прошли предыдущие главы, значит, вы уже видели, что мы создали методы для отображения, отображения, удаления и создания данных и т. Д., Но scaffolding выполняет эту работу автоматически.