Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #73, ДЕКАБРЬ 2006 г.

вагон-ресторан

БОРИС ВОЛЬФСОН

Спецвыпуск: Хакер, номер #073, стр. 073-060-3


Используем скаффолдинг

class DiskController < ApplicationController

scaffold: disk

end

Теперь можем идти по адресу http://127.0.0.1:3000/Disk/new, где увидим форму для заполнения данных о диске. После создания нескольких дисков можно посмотреть их список здесь: http://127.0.0.1:3000/Disk/list.

Вот так вот, всего одна строчка кода оживила нашу программу!

[шаблоны-представления.]

Не знаю, как читателям, а мне не очень нравится стандартный дизайн и нерусские слова, поэтому попробуем это исправить. Определим, какие данные должен получать шаблон:

Передаем в шаблон список дисков

class DiskController < ApplicationController

scaffold :disk

def list

@disks = Disk.find_all

end

end

Затем пишем сам шаблон, который больше похож на обычный HTML-файл:

Шаблон для списка дисков

<html>

<head>

<title>Список дисков</title>

</head>

<body>

<h1>Список дисков</h1>

<table border="1">

<tr>

<th>Название</th>

<th>Исполнитель</th>

<th>Дата выпуска</th>

</tr>

<% @disks.each do |disk| %>

<tr>

<td><%= link_to disk.title, :action => "show", :id => disk.id %></td>

<td><%= disk.artist %></td>

<td><%= disk.date %></td>

</tr>

<% end %>

</table>

<p><%= link_to "Внести новый альбом", :action => "new" %></p>

</body>

</html>

Для начала поясню конструкцию <% @disks.each do |disk| %> - это «встроенный» Раби-код, который перебирает все диски и присваивает поочередно все значения переменной disk, которая затем выводится на экран. И еще один краткий комментарий по поводу функции: link_to – это функция для создания ссылок. Если ты заметил, у меня появилось новое поле artist – исполнитель: я просто внес изменения в базу данных, а Раби сделал остальное!

[связь таблиц.]

Хотелось бы продемонстрировать, как RoR работает со связанными таблицами. Каждому альбому мы присвоим жанр:

Таблица для хранения жанров

CREATE TABLE `genres` (

`id` tinyint(4) NOT NULL auto_increment,

`title` varchar(255) NOT NULL default '',

PRIMARY KEY (`id`),

UNIQUE KEY `title` (`title`)

) TYPE=MyISAM;

Чтобы создать связь таблиц, нам надо поработать с моделями:

Файл disk.rb

class Disk < ActiveRecord::Base

belongs_to :genre

end

Файл genre.rb

class Genre < ActiveRecord::Base

has_many :disk

end

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

[редактирование диска.]

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

Пересылка в шаблон дополнительных данных при редактировании

class DiskController < ApplicationController

scaffold :disk

def list

@disks = Disk.find_all

Назад на стр. 073-060-2  Содержание  Вперед на стр. 073-060-4