http://wiki.linuxformat.ru/wiki/index.php?title=LXF108:Rails&feed=atom&action=historyLXF108:Rails - История изменений2024-03-29T06:29:39ZИстория изменений этой страницы в викиMediaWiki 1.19.20+dfsg-0+deb7u3http://wiki.linuxformat.ru/wiki/index.php?title=LXF108:Rails&diff=8541&oldid=prevYaleks: /* Просмотр фотографий */2009-08-24T17:02:40Z<p><span dir="auto"><span class="autocomment">Просмотр фотографий</span></span></p>
<table class='diff diff-contentalign-left'>
<col class='diff-marker' />
<col class='diff-content' />
<col class='diff-marker' />
<col class='diff-content' />
<tr valign='top'>
<td colspan='2' style="background-color: white; color:black;">← Предыдущая</td>
<td colspan='2' style="background-color: white; color:black;">Версия 17:02, 24 августа 2009</td>
</tr><tr><td colspan="2" class="diff-lineno">Строка 264:</td>
<td colspan="2" class="diff-lineno">Строка 264:</td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>[[Изображение:LXF108 69 2.png|400px|right]]</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>[[Изображение:LXF108 69 2.png|400px|right]]</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>Контроллер ApplicationController определяется в файле app/controllers/application.rb и наследует от ActionController::Base. Это действие, которое по умолчанию визуализирует шаблон app/views/photos/index.erb.html. PhotosController доступен по адресу http://localhost:3000/</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div>Контроллер ApplicationController определяется в файле app/controllers/application.rb и наследует от ActionController::Base. Это действие, которое по умолчанию визуализирует шаблон app/views/photos/index.erb.html. PhotosController доступен по адресу http://localhost:3000/photos. Чтобы миниатюры не выводились на индексной странице, контроллер нужно изменить. Отредактируйте файл app/controllers/photos_controller.rb так, чтобы вывод индекса игнорировал миниатюры, где-то</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="background: #ffa; color:black; font-size: smaller;"><div>photos. Чтобы миниатюры не выводились на индексной странице, контроллер нужно изменить. Отредактируйте файл app/controllers/photos_controller.rb так, чтобы вывод индекса игнорировал миниатюры, где-то</div></td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>в строке 5:</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>в строке 5:</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>  @photos = Photo.find(:all, :conditions => ‘thumbnail is NULL’)</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>  @photos = Photo.find(:all, :conditions => ‘thumbnail is NULL’)</div></td></tr>
</table>Yalekshttp://wiki.linuxformat.ru/wiki/index.php?title=LXF108:Rails&diff=8540&oldid=prevYaleks в 17:01, 24 августа 20092009-08-24T17:01:53Z<p></p>
<table class='diff diff-contentalign-left'>
<col class='diff-marker' />
<col class='diff-content' />
<col class='diff-marker' />
<col class='diff-content' />
<tr valign='top'>
<td colspan='2' style="background-color: white; color:black;">← Предыдущая</td>
<td colspan='2' style="background-color: white; color:black;">Версия 17:01, 24 августа 2009</td>
</tr><tr><td colspan="2" class="diff-lineno">Строка 88:</td>
<td colspan="2" class="diff-lineno">Строка 88:</td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>=== Часть 2 Приступаем к делу ===</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>=== Часть 2 Приступаем к делу ===</div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">{{Врезка</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">|Заголовок=Скорая помощь</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">|Содержание=Добавьте set incsearch в ваш vimrc для поиска по мере ввода текста и используйте Ctrl+P для подстановки.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">|Ширина=100px}}</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">[[Изображение:LXF108 67 2.png|400px|right]]</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">[[Изображение:LXF108 68 1.png|400px|right]]</ins></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>Теперь пора показать, какая это стоящая и простая штука – разработка с Rails. Rails содержит средства генерации скелетных файлов,</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>Теперь пора показать, какая это стоящая и простая штука – разработка с Rails. Rails содержит средства генерации скелетных файлов,</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>позволяющих создавать полнофункциональные приложения, а также</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>позволяющих создавать полнофункциональные приложения, а также</div></td></tr>
<tr><td colspan="2" class="diff-lineno">Строка 152:</td>
<td colspan="2" class="diff-lineno">Строка 158:</td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>==== Добавляем стиль ====</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>==== Добавляем стиль ====</div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">{{Врезка</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">|Заголовок=Попробуйте Ruby |Содержание=Вы новичок в Ruby и хотите попробовать язык, ничего не устанавливая? Try Ruby (http://tryruby.hobix.com) – это web-консоль Ruby, с помощью которой можно попробовать язык в браузере.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">|Ширина=200px}}</ins></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>Генератор каркаса создал файл app/views/layouts/photos.html.erb. В</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>Генератор каркаса создал файл app/views/layouts/photos.html.erb. В</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>директории раскладок сайта находятся различные HTML-шаблоны.</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>директории раскладок сайта находятся различные HTML-шаблоны.</div></td></tr>
<tr><td colspan="2" class="diff-lineno">Строка 186:</td>
<td colspan="2" class="diff-lineno">Строка 195:</td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>==== Просмотр фотографий ====</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>==== Просмотр фотографий ====</div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">{{Врезка</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">|Заголовок=Искусное редактирование текста в Linux</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">|Содержание=Большинство обучающих роликов по Rails</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">записаны в TextMate и Mac OS X. Пользователи</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">Linux могут сделать примерно то же самое (и,</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">возможно, пойти дальше), используя Vim с</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">этими замечательными модулями расширения</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">и возможностями самого Vim:</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">* Project Быстро систематизирует файлы проекта Rails и производит поиск в них: http://vim.sourceforge.net/scripts/script.php?script_id=69.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">* PMiniBufExplorer Добавляет вкладки для быстрого переключения между открытыми файлами: www.vim.org/scripts/script.php?script_id=159.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">|Ширина=250px}}</ins></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>Перед тестированием нужно исправить виды ‘photo edit’ и ‘new’, активировав в них загрузку файлов. Откройте views/photos/edit.html.erb и</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>Перед тестированием нужно исправить виды ‘photo edit’ и ‘new’, активировав в них загрузку файлов. Откройте views/photos/edit.html.erb и</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>views/photos/new.html.erb и измените определение формы на следующее (это просто стенографическая запись Rails для HTML-кода):</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>views/photos/new.html.erb и измените определение формы на следующее (это просто стенографическая запись Rails для HTML-кода):</div></td></tr>
<tr><td colspan="2" class="diff-lineno">Строка 243:</td>
<td colspan="2" class="diff-lineno">Строка 263:</td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>оба вернут /photos.</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>оба вернут /photos.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">[[Изображение:LXF108 69 2.png|400px|right]]</ins></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>Контроллер ApplicationController определяется в файле app/controllers/application.rb и наследует от ActionController::Base. Это действие, которое по умолчанию визуализирует шаблон app/views/photos/index.erb.html. PhotosController доступен по адресу http://localhost:3000/</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>Контроллер ApplicationController определяется в файле app/controllers/application.rb и наследует от ActionController::Base. Это действие, которое по умолчанию визуализирует шаблон app/views/photos/index.erb.html. PhotosController доступен по адресу http://localhost:3000/</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>photos. Чтобы миниатюры не выводились на индексной странице, контроллер нужно изменить. Отредактируйте файл app/controllers/photos_controller.rb так, чтобы вывод индекса игнорировал миниатюры, где-то</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>photos. Чтобы миниатюры не выводились на индексной странице, контроллер нужно изменить. Отредактируйте файл app/controllers/photos_controller.rb так, чтобы вывод индекса игнорировал миниатюры, где-то</div></td></tr>
<tr><td colspan="2" class="diff-lineno">Строка 266:</td>
<td colspan="2" class="diff-lineno">Строка 287:</td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>==== Стили фотографий ====</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>==== Стили фотографий ====</div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">{{Врезка</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">|Заголовок=Скорая помощь</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">|Содержание=Vim 7 поддерживает</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">вкладки с :h tabnew.</ins></div></td></tr>
<tr><td colspan="2"> </td><td class='diff-marker'>+</td><td style="background: #cfc; color:black; font-size: smaller;"><div><ins style="color: red; font-weight: bold; text-decoration: none;">|Ширина=70px}}</ins></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>Таблицы стилей хранятся в каталоге public/stylesheets. Добавьте туда</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>Таблицы стилей хранятся в каталоге public/stylesheets. Добавьте туда</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>файл screen.css:</div></td><td class='diff-marker'> </td><td style="background: #eee; color:black; font-size: smaller;"><div>файл screen.css:</div></td></tr>
</table>Yalekshttp://wiki.linuxformat.ru/wiki/index.php?title=LXF108:Rails&diff=8498&oldid=prevYaleks: Новая: == Rails: Создаем фотоальбом == : ''Страшитесь C? Путаетесь в Perl? Пусть '''Алекс Янг''' покажет вам, как просто и ...2009-08-23T09:47:47Z<p>Новая: == Rails: Создаем фотоальбом == : ''Страшитесь C? Путаетесь в Perl? Пусть '''Алекс Янг''' покажет вам, как просто и ...</p>
<p><b>Новая страница</b></p><div>== Rails: Создаем фотоальбом ==<br />
: ''Страшитесь C? Путаетесь в Perl? Пусть '''Алекс Янг''' покажет вам, как просто и быстро начать программировать на Ruby.''<br />
<br />
С момента своего создания фотогалерея Flickr поразительно<br />
разрослась. Она полностью изменила наши представления о<br />
хранении снимков в Интернете, а через ее каталоги каждый<br />
посетитель мог достаточно просто найти самые интересные фотографии. Но как ни хороша Flickr, разве не здорово иметь на своем сайте<br />
личную фотогалерею? Можно реализовать те возможности, которые<br />
нужны именно вам, и даже поделиться кодом с друзьями, чтобы они<br />
тоже создали себе нечто подобное.<br />
<br />
Для написания классной, продвинутой галереи мы воспользуемся<br />
Ruby on Rails. Rails избавляет вас от мучений, присущих обычной web-разработке – можете забыть о мороке с SQL и XML; Rails предоставляет<br />
простые и удобные для восприятия абстракции через дружелюбный к<br />
программисту код Ruby. Его легко установить – потребуются лишь база<br />
данных и web-сервер; и web-разработка упрощается, благодаря наличию готовой структуры для каждого приложения.<br />
<br />
Rails испытывает влияние популярных методологий: Не Повторяй<br />
Самого Себя (Don’t Repeat Yourself – DRY) и Разработка Через<br />
Тестирование (Test Driven Development – TDD). DRY предполагает,<br />
что код не должен дублироваться, и это уменьшает общую сложность проекта. TDD часто практикуется профессиональными Rails-разработчиками: данный метод подразумевает тестирование кода до<br />
его завершения. Написание тестов до того, как написано само приложение, часто способствует разработке более API-подобного кода с<br />
более ясной инкапсуляцией.<br />
<br />
Мы рассмотрим некоторые технологии, используемые Rails-разработчиками в реальных проектах:<br />
* Установим Ruby on Rails с библиотеками и модулями расширения для обработки изображений.<br />
* Создадим фотогалерею с миниатюрами и возможностью управления пользователями.<br />
* Ознакомимся с основными компонентами каркаса Rails.<br />
<br />
=== Часть 1 Устанавливаем Rails ===<br />
Первая установка Rails кажется сложнее, чем она есть на самом деле –<br />
ведь познакомиться придется всего лишь с несколькими технологиями<br />
(если вы уже не программист Ruby!). Чтобы установить Rails, отвечающий потребностям нашего проекта, потребуются пять компонентов:<br />
* Ruby.<br />
* RubyGems.<br />
* Ruby on Rails: http://rubyonrails.org.<br />
* Реляционная СУБД – MySQL, PostgreSQL, SQLite (сегодня мы будем пользоваться SQLite).<br />
* Прочие библиотеки для обработки изображений и работы с Rails.<br />
Минут через 15 все должно быть готово к написанию кода.<br />
<br />
Для начала нужно проверить, установлен ли Ruby: команда which<br />
ruby выведет путь к интерпретатору. Если его у вас нет, понадобится<br />
пакет Ruby, и он есть в большинстве дистрибутивов Linux. В Debian и<br />
Ubuntu Ruby можно установить с помощью команды<br />
sudo apt-get install ruby1.8<br />
Желаете собрать Ruby из исходников? Загрузите их с сайта http://www.rubylang.org/en. Затем вам понадобится RubyGems – менеджер пакетов, с помощью которого можно устанавливать, удалять и обновлять<br />
библиотеки Ruby. В большинстве дистрибутивов Linux есть пакет для<br />
RubyGems: например, в Debian и Ubuntu это libgems-ruby1.8. Однако на<br />
момент написания статьи пакеты в этих дистрибутивах сильно устарели и не будут корректно работать с Rails 2, поэтому лучше установите<br />
Gems из исходных текстов.<br />
<br />
Загрузите архив с сайта http://www.rubygems.org и распакуйте его, а затем<br />
запустите из получившегося каталога следующую команду:<br />
sudo ruby setup.rb<br />
Она установит команду gem1.8 и связанные с ней библиотеки.<br />
<br />
После установки RubyGems добавление Rails – сущий пустяк.<br />
Следующая команда инсталлирует все необходимые библиотеки Ruby,<br />
а также утилиты командной строки Rails:<br />
sudo gem1.8 install rails rake<br />
Для хранения данных моделей Rails также необходима реляционная<br />
БД. Если вам кажется, что сервер СУБД на рабочем столе – излишество, есть прекрасная альтернатива для локальной разработки – SQLite<br />
(http://www.sqlite.org). Удостоверьтесь, что установлены как SQLite, так и ее<br />
библиотеки для разработчиков. Для этого выполните команды:<br />
<pre>sudo apt-get install sqlite3<br />
sudo apt-get install libsqlite3-dev<br />
sudo gem1.8 install sqlite3-ruby</pre><br />
<br />
==== Убедимся, что все работает ====<br />
Теперь давайте проверим, что Rails установлен корректно. Чтобы<br />
начать проект Rails, просто наберите rails gallery – при этом будут созданы все необходимые каталоги и файлы конфигурации:<br />
<pre>rails gallery<br />
cd gallery<br />
script/server</pre><br />
Последняя строка запускает web-сервер на Ruby, его можно<br />
использовать при разработке проекта. Откройте запущенный проект<br />
в браузере (http://localhost:3000). Вы должны увидеть страницу приглашения Rails. Пусть она висит в фоне, пока вы заняты этим уроком.<br />
Согласно настройкам БД по умолчанию, в подкаталоге db/ каталога<br />
проекта будет автоматически создана база данных SQLite3. Если вы<br />
хотите использовать вместо нее MySQL или Postgres, отредактируйте<br />
файл config/database.yml, указав в нем настройки своей БД. Убедитесь,<br />
что переменная adapter установлена в mysql или postgresql.<br />
<br />
Наконец, фотогалерея будет бесполезной, если в ней не будет базовых возможностей обработки изображений. Для создания высококачественных миниатюр, воспользуемся библиотеками Rails ImageMagick<br />
и RMagick:<br />
<pre>sudo apt-get install libmagick9-dev<br />
sudo gem install rmagick</pre><br />
<br />
=== Часть 2 Приступаем к делу ===<br />
Теперь пора показать, какая это стоящая и простая штука – разработка с Rails. Rails содержит средства генерации скелетных файлов,<br />
позволяющих создавать полнофункциональные приложения, а также<br />
поддерживает модули расширения. Мы воспользуемся и тем, и другим, чтобы написать галерею быстрее, чем разработчик на C# загрузит<br />
Visual Studio.<br />
<br />
Если бы я сел и написал набор утилит для управления пользователями, у меня бы вышло нечто очень похожее на модуль Restful<br />
Authentication Рика Олсона [Rick Olson] – ну так сэкономим время и<br />
усилия и сразу возьмем его. Из подкаталога gallery/ каталога проекта<br />
выполните команды:<br />
<pre>script/plugin source http://svn.techno-weenie.net/projects/plugins<br />
script/plugin install restful_authentication<br />
script/generate authenticated user sessions</pre><br />
Модуль Restful Authentication предоставляет: модель БД для пользователя; миграции БД для создания пользователя; контроллеры пользователя и сессии для обработки создания учетной записи, вход в<br />
систему и запоминание пользователя в cookies.<br />
<br />
Модули устанавливаются в подкаталог vendor/plugins/ каталога<br />
проекта. Данный конкретный экземпляр также добавляет файлы в код<br />
проекта в каталоге app/ с помощью генератора.<br />
<br />
Теперь откроем файл app/models/user.rb и рассмотрим код модуля.<br />
Он представляет несколько общеупотребимых технологий для управления объектами ActiveRecord. ActiveRecord – одна из основных частей<br />
каркаса: она отображает объекты Ruby на базу данных.<br />
<br />
Даже с небольшим опытом в Ruby или его полным отсутствием вы<br />
должны понять следующий код:<br />
validates_presence_of :login, :email<br />
before_save :encrypt_password<br />
Эти строки – на самом деле методы, которые выглядят как макросы; это общепринятый стиль в Rails. С помощью методов validates_<br />
легко проверить поля перед их сохранением в базе данных. Метод<br />
before_save реализует жизненный цикл объекта – он позволяет вам<br />
выполнять свой собственный код при сохранении данных в базе. Здесь<br />
перед записью модели в БД будет вызван метод encrypt_password.<br />
<br />
Прежде чем продолжить, запустите процедуру миграции, полученную от модуля:<br />
rake db:migrate<br />
Она выведет некоторые данные о таблице:<br />
<pre>1 CreateUsers: migrating<br />
-- create_table(“users”, {:force=>true})<br />
-> 0.0044s<br />
1 CreateUsers: migrated (0.0046s)</pre><br />
<br />
==== Добавим пользователя и зайдем ====<br />
Но как нам воспользоваться тем, что мы успели добавить? К счастью,<br />
модуль Restful Authentication установил контроллер, поддерживающий<br />
создание пользователя. Контроллеры – другая важная часть Rails:<br />
здесь они известны как ActionControllers и находятся между HTML-шаблонами и моделями ActiveRecord.<br />
<br />
Чтобы добавить пользователя, зайдите на http://localhost:3000/users/new в своем браузере и введите необходимые данные. Затем<br />
укажите выбранное вами имя на http://localhost:3000/sessions/new.<br />
Вы будете отосланы на страницу шаблона Rails, но после добавления<br />
фотографий мы это исправим. Выполните команду:<br />
<pre>script/generate scaffold photo title:string description:text filename:<br />
string content_type:string size:integer user_id:integer width:<br />
integer height:integer parent_id:integer path:string thumbnail:string<br />
rake db:migrate</pre><br />
Будут добавлены: модель Photo; таблица в БД для фотографий с ID<br />
(создается автоматически) и набором необходимых полей; контроллер<br />
PhotosController с действиями по просмотру, созданию, обновлению и<br />
удалению фотографий; и сопутствующие представления (виды). Чтобы<br />
взглянуть на результаты, откройте адрес http://localhost:3000/photos.<br />
Хотя это и работает, но выглядит не очень. Опять же и контроллер<br />
пользователя не сочетается с сайтом. Давайте решим эти проблемы…<br />
<br />
==== Добавляем стиль ====<br />
Генератор каркаса создал файл app/views/layouts/photos.html.erb. В<br />
директории раскладок сайта находятся различные HTML-шаблоны.<br />
Используйте только один для вашего приложения, и он будет разделен<br />
между контроллерами.<br />
<br />
Все контроллеры по умолчанию используют шаблон application.<br />
html.erb, если не задано иное, поэтому переименуйте photos.html.erb в<br />
application.html.erb, откройте его и измените содержимое тэга <title> на<br />
что-нибудь более общее. Открыв http://localhost:3000/users в своем браузере, вы увидите пользовательские шаблоны с application.html.erb.<br />
<br />
Теперь нужно лишь задать индексную страницу сайта. Используем<br />
в качестве нее список фотографий. Удалите файл public/index.html,<br />
который был установлен Rails, и добавьте следующую строку в файл<br />
config/routes.rb:<br />
map.connect ‘’, :controller => ‘photos’<br />
Rails предоставляет все, что нужно для обработки загрузки файлов.<br />
Однако вместо реализации ее в PhotosController (сокращение контроллера и повторное использование кода в моделях – хорошая практика),<br />
можно поместить большую часть в модель Photo. Так как все загрузки файлов обрабатываются в общем-то одинаково, для добавления в<br />
модель необходимого функционала можно воспользоваться модулем<br />
расширения. Установите модуль attachment_fu:<br />
script/plugin install attachment_fu<br />
Теперь откройте модель Post (app/models/post.rb) и настройте его:<br />
<pre>class Photo < ActiveRecord::Base<br />
has_attachment :storage => :file_system,<br />
:thumbnails => { :thumb => ‘160>’ },<br />
:content_type => :image<br />
validates_as_attachment<br />
end</pre><br />
Открыв модель Photo, добавьте следующую строку:<br />
belongs_to :user<br />
Будет установлена связь между фотографиями и пользователями.<br />
Также можно добавить has_many :photos в модель User.<br />
<br />
==== Просмотр фотографий ====<br />
Перед тестированием нужно исправить виды ‘photo edit’ и ‘new’, активировав в них загрузку файлов. Откройте views/photos/edit.html.erb и<br />
views/photos/new.html.erb и измените определение формы на следующее (это просто стенографическая запись Rails для HTML-кода):<br />
<% form_for(@photo, :html => { :multipart => true }) do |f| %><br />
Некоторые из полей, созданных генератором, не подходят для<br />
наших форм. Уберите все поля после Description в обоих шаблонах –<br />
просто удалите целый блок для каждого поля, включая тэг параграфа.<br />
Наконец, добавьте поле загрузки файла:<br />
<source lang="html4strict"><p><br />
<b>Photo</b><br /><br />
<%= f.file_field :uploaded_data %><br />
</p></source><br />
Теперь нужно изменить индексную страницу, содержащую список<br />
фотографий – так, чтобы на ней показывались миниатюры. Замените<br />
весь файл строкой:<br />
render :partial => ‘photo’, :collection => @photos %><br />
Эта строка выводит ‘partial’ (так называются повторно используемые<br />
шаблоны) для каждой фотографии в массиве @photos. Контроллер<br />
PhotosController загружает @photos в действии для индексной страницы. Добавить partial для фотографий просто: создайте файл app/views/photos/_photo.html.erb и добавьте в него строки:<br />
<source lang="html4strict"><div class=”photo”><br />
<h2><br />
<%= h photo.title %> <%= link_to ‘Edit’, edit_photo_path(photo) %><br />
<%= link_to ‘Delete’, photo, :confirm => ‘Are you sure?’, :method =><br />
:delete %><br />
</h2><br />
<%= link_to image_tag(photo.public_filename(:thumb)), photo %><br />
<%= textilize h(truncate(photo.description)) %><br />
</div></source><br />
Некоторые из вызовов этих методов – помощники, предоставляемые Rails и библиотеками, которые он использует. Например, h()<br />
гарантирует, что текст безопасен и не содержит HTML-кода – это хороший способ «провести санобработку» отправляемого пользователем<br />
контента. Метод textilize выводит текст в соответствии с требованиями<br />
Textile.<br />
<br />
Также можно отредактировать файл app/views/photos/show.html.<br />
erb, удалив ненужные поля. Я убрал заголовок (‘title’), переместил<br />
ссылки «редактировать/назад» в верхнюю часть файла и добавил тэг<br />
image для фотографии:<br />
<source lang="html4strict"><h2><%=h @photo.title %></h2><br />
<%= link_to ‘Edit’, edit_photo_path(@photo) %> |<br />
<%= link_to ‘Back’, photos_path %><br />
<div class=”large_photo”><%= image_tag @photo.public_filename %></div></source><br />
Теперь измените основной шаблон (app/views/layouts/application.<br />
html.erb), исправив строку stylesheet_link_tag на…<br />
<source lang="html4strict"><%= stylesheet_link_tag :all %></source><br />
…и добавив некую общую навигацию над выражением yield:<br />
<source lang="html4strict"><div id=”navigation”><br />
<% if current_user %><br />
<%= link_to ‘Logout’, session_url, :method => ‘delete’ %> |<br />
<% else %><br />
<%= link_to ‘Login’, new_session_url %> | <%= link_to ‘Register’, new_user_url %> |<br />
<% end %><br />
<%= link_to ‘All Photos’, photos_url %> | <%= link_to ‘New Photo’, new_photo_path %><br />
</div></source><br />
Вы будете часто использовать link_to. Он создает ссылки на основе файла config/routes.rb, гарантируя, что URL-адреса будут выглядеть<br />
именно так, как вы хотите, и позволяя вам забыть о том, как они пишутся. Если вы видите метод, который заканчивается на _url или _path,<br />
знайте, что это ссылка на путь. Например, photos_url и photos_path<br />
оба вернут /photos.<br />
<br />
Контроллер ApplicationController определяется в файле app/controllers/application.rb и наследует от ActionController::Base. Это действие, которое по умолчанию визуализирует шаблон app/views/photos/index.erb.html. PhotosController доступен по адресу http://localhost:3000/<br />
photos. Чтобы миниатюры не выводились на индексной странице, контроллер нужно изменить. Отредактируйте файл app/controllers/photos_controller.rb так, чтобы вывод индекса игнорировал миниатюры, где-то<br />
в строке 5:<br />
@photos = Photo.find(:all, :conditions => ‘thumbnail is NULL’)<br />
Перед отправкой фотографий также нужно убедиться в том,<br />
что пользователь зашел в систему. Удалите следующие строки из<br />
UsersController и добавьте их в app/controllers/application.rb:<br />
<source lang=ini># Be sure to include AuthenticationSystem in Application<br />
# Controller instead<br />
include AuthenticatedSystem</source><br />
Теперь нужно удостовериться, что при создании пользователя<br />
устанавливается его ID. Замените первую строку действия create в<br />
PhotosController:<br />
@photo = current_user.photos.new params[:photo]<br />
и измените первую строку действия update:<br />
@photo = current_user.photos.find params[:id]<br />
Как видите, здесь, для гарантии того, что пользователь может<br />
редактировать только свои фотографии, используется связь Photos с<br />
моделью User. Нужно сделать еще кое-что: убедиться, что только пользователи, зашедшие в систему, могут создавать и редактировать фотографии. Это можно сделать с помощью модуля Restful Authentication.<br />
Добавьте такую строку над выводом индекса в PhotosController:<br />
before_filter :login_required, :only => [ :edit, :update, :new, :create ]<br />
<br />
==== Стили фотографий ====<br />
Таблицы стилей хранятся в каталоге public/stylesheets. Добавьте туда<br />
файл screen.css:<br />
<source lang="css">#navigation { background-color: #000; padding: 4px; margin: 0; color:<br />
#aaa; }<br />
#navigation a { color: #fff; text-decoration: none; }<br />
#navigation a:hover { background-color: #fff; color: #000; }<br />
.photo { width: 30%; float: left; background-color: #f0f0f0; margin:<br />
10px 10px 0 0; padding: 10px; height: 220px; }<br />
.photo h2 { margin: 0 0 14px 0; padding: 0; font-size: 1.5em; }<br />
.large_photo { margin: 10px 0; }</source><br />
Остановите script/server на своем терминале, нажав Ctrl+C. Теперь<br />
снова запустите его, и attachment-fu будет готов к использованию в<br />
вашей фотогалерее.<br />
<br />
После добавления модулей в проект нужно перегрузить процесс<br />
web-сервера; то же относится к изменению файлов конфигурации<br />
Rails, включая config/environment.rb. К счастью, остальной код и config/routes.rb редактируются динамически.<br />
<br />
Теперь можно кликнуть по ссылке Register для создания пользователя и зайти в систему. Помните, что при этом используется имя, а не<br />
адрес электронной почты. Кликните по ссылке New Photo для загрузки<br />
фотографии в коллекцию. Теперь используйте сэкономленное время:<br />
загрузите свои отпускные снимки!</div>Yaleks