Создание моего блога на Rails
A journey building a blog with Ruby on Rails, from initial setup to adding features like comments, tagging, and authorization.
Этот сайт создан с использованием технологии Ruby on Rails! Я использую его как песочницу для обучения и экспериментов, и этот пост - ретроспектива процесса разработки.
2010-08-25: Задачи
История:
-
- Начало. 24.08.2010
- Локализация. 24.08.2010-25.08.2010
- Стили и первоначальный дизайн. 25.08.2010
- Рефакторинг. 25.08.2010, 26.08.2010
- Сортировать записи от новых к старым. 25.08.2010
- Добавлены заголовки страниц. 25.08.2010
- Добавлена иконка :). 25.08.2010
- Форматирование сообщений при помощи textile. 25.08.2010
- Отобразить дату публикации. 25.08.2010
- Защита от notextile. 26.08.2010
- Исправлен заголовок страницы при просмотре записи. 26.08.2010
- Switched to Rails 3. 29.08.2010
- Добавлена возможность комментирования. 06.09.2010
- Добавлена постраничная навигация 11.09.2010
- Добавлена возможность присвоения меток сообщениям 23.09.2010
2010-08-24: Rails Rocks!
“Ruby on Rails is a breakthrough in lowering the barriers of entry to programming.
Powerful web applications that formerly might have taken weeks or months
to develop can be produced in a matter of days.”
Я обновился до Rails 3. Ресурсы, которые мне очень помогли:
- [The Getting Started Guide](http://guides.rubyonrails.org/getting_started.html)
-
- [i18n](http://guides.rubyonrails.org/i18n.html)
- [Ruby on Rails Tutorial Book](http://www.railstutorial.org/)
- [Agile Web Development with Rails, 4th Edition](http://pragprog.com/titles/rails4/agile-web-development-with-rails)
2010-08-25: Добавил стиля
Первоначальное внимание было уделено запуску основной функциональности. Это включало настройку основных моделей, представлений и контроллеров для создания, чтения, обновления и удаления сообщений в блоге.
2010-08-26: Show and Index
Я создал partial _showpost.html.erb
, который можно использовать как на странице индекса (список всех сообщений), так и на странице отображения (отображение одного сообщения). Это помогло сохранить код DRY (Don’t Repeat Yourself). Сделано.
2010-08-27: Текущее состояние сайта
В настоящее время сайт поддерживает:
Страницы:
- Редактирование
-
- Новая запись
- Редактирование записи
- Просмотр
-
- Просмотр списка записей
- Просмотр записи
<p>Дополнительная функциональность:
<ul>
- Удаление записи
- Форматирование записи
</ul></p>
2010-08-25: Проверка форматирования
Мне нужен был способ форматировать сообщения в блоге. Это включало в себя устранение потенциальных рисков безопасности.
Маркированный список:
-
- **Жирный**
- *Курсив*
- Подчёркнутый
-
<p>Нумерованный список:
<ol>
- **Жирный**
- *Курсив*
- <ins>Подчёркнутый</ins>
- <del>Зачёркнутый</del>
</ol></p>
Опасность:
notextile.
<script>document.body.onload=function(){document.body.innerHTML = 'JAVASCRIPT!!! ОПАСНОСТЕ';}</script>
Опасность устранена:
notextile.
2010-08-25: 8-й шаг: Комментарии
Следующий этап – комментарии. Это создало несколько немедленных проблем:
- Регистрация
- Анти-спам меры
- Следует ли включать форматирование в комментариях?
2010-08-29: Авторизация добавлена
Авторизация добавлена.
2010-08-30: Прикрутил комментарии
2010-09-06: Прикрутил комментарии. Попытка 2
2010-08-28: Метки
Я реализовал метки для группировки сообщений и управления их отображением. Поля меток включают имя метки и ссылки на настройки конфиденциальности. Идея состоит в том, чтобы иметь метки, которые действуют как родители, чтобы упростить пометку сообщений. Например, если пользователь помечает сообщение как “C++”, оно также должно быть помечено как “программирование”.
Метки в конечном итоге будут использоваться для создания навигации по сайту.
Существуют синонимы меток (для предотвращения дубликатов) и родительские метки (для создания иерархической структуры).
Метка без родителя имеет специальное назначение. У метки может быть только один родитель. Если вам нужно включить статью в несколько разделов, назначьте ей несколько меток.
Специальные метки: конфиденциальность, категория сайта.
Метки конфиденциальности: опубликовано, частное, скрытое (требуется прямая ссылка).
Метки категорий: будни, хобби, обо мне, …
Итак, у нас есть 4 типа меток:
1. Метки категорий (подкатегории)
2. Синонимы меток
3. Языковые метки
4. Метки конфиденциальности
Use Cases
- Назначить метку записи
- Использовать существующую метку
-
- Отобразить список меток
- Отобразить список меток, начинающихся с заданной буквы
- Выбрать метку
- Создать новую метку
-
- Ввести имя метки
- Установить связи между метками
- Использовать существующую метку
- Отобразить записи по заданной метке
-
- Отобразить список меток
- Отобразить категорию метки (все сообщения с заданной меткой, синонимы заданной метки и метки, являющиеся ее потомками)
- Не отображать сообщения с частной меткой незарегистрированным пользователям
- Отображать сообщения с частной меткой зарегистрированным пользователям
Дизайн
Отношение “Метки конфиденциальности”.
Отношение “Категории меток” many-to-many. Каждая метка может принадлежать к нескольким категориям. Каждая категория может содержать сообщения с несколькими метками.
Отношение “Синонимы меток” один-ко-многим. Каждая метка может иметь несколько синонимов. У каждого синонима есть одна метка, синонимом которой он является.
Я создал интерфейс для управления метками.
А также helper link_to_label(labelname).
Модель данных для меток
Метки | |
---|---|
Имя поля | Тип |
id | integer |
name | string |
Модель данных для отношения метка-метка
Таблицы:
create_table "appearances", do |t|
t.column "dancer_id", :integer, :null => false
t.column "movie_id", :integer, :null => false
t.column "character_name", :string
t.column "dance_numbers", :integer
end
Модели:
class Appearance < ActiveRecord::Base
belongs_to :dancer
belongs_to :movie
end
class Dancer < ActiveRecord::Base
has_many :appearances, :dependent => true
has_many :movies, :through => :appearances
end
class Movie < ActiveRecord::Base
has_many :appearances, :dependent => true
has_many :dancers, :through => :appearances
end
rails generate scaffold Label id:string
2010-09-23: Метки добавлены!
Метки добавлены! В настоящее время нет способа фильтровать сообщения по метке.
Добавить:
- Всплывающие подсказки по мере ввода меток (по образцу на Stackoverflow.com)
- Фильтрация сообщений по меткам
Присутствуют синонимы меток.
2010-09-06: Формы множественного числа
Ruby on Rails имеет встроенную поддержку форм множественного числа.
Например, можно отобразить строки “1 комментарий”, “2 комментария”, “5 комментариев” и т. д.
Для этого вызовите функцию translate следующим образом:
t(:comments, :count => post.comments.size)
Здесь :comments
- это склоняемая строка, :count
- это переменная специального типа, post.comments.size
- это фактическое количество комментариев.
В файле локализации config/locales/ru.yml
у нас есть:
zero: 'Нет комментариев' # 0
one: '%{count} комментарий' # 1, 21, 31, 41, 51, 61...
few: '%{count} комментария' # 2-4, 22-24, 32-34...
many: '%{count} комментариев' # 5-20, 25-30, 35-40...
Также необходимо установить gem “russian” для поддержки правил форм (few, many).
2010-10-20: TODO: categories
Мне нужно разработать категории.
Каждая категория состоит из множества меток.
Каждая метка принадлежит к одной категории.
Список категорий появляется в верхней части каждой страницы.
2010-11-27: Combine labels and folders
Смешивание меток и папок.
- Пользователь может выбирать метки или иерархическое представление
- Пользователь может выбирать просмотр как метку или просмотр как папку
- Пользователь может выбрать метку и отобразить все элементы с этой меткой
- Пользователь может выбрать папку и отобразить только элементы в этой папке
- Пользователь может выбрать отображение корневых элементов
- Пользователь может выбрать отображение элементов без меток
2010-09-03: Проблема со временем
Информация о времени любого сообщения в Интернете обычно не содержит каких-либо явных указаний на часовой пояс, в котором находится автор. Обычно посетителю предоставляется время сообщения, скорректированное с учетом часового пояса сервера или часового пояса посетителя. И время сообщения регистрируется только как время по Гринвичу.
В результате теряется часть информации о сообщении, а именно местоположение его автора.
2010-08-30: Вышел Ruby On Rails 3.0
Уря! Я вовремя обновился!
>>> Новость на LORе
2010-08-25: Задачи
<p><span class="caps">TODO</span>:
<ul>
<li>Мелкие:
<ul>
- показывать лишь часть сообщения.
- tab-order: remove toolbar.
- время отображается по гринвичу.
- HTML5 article tag.
- <span class="caps">CSS</span> for code (<pre>)
</ul></li>
<li>Технические:
<ul>
<li>Статическое хранение (gollum, jekyll, nanoc)
<ul>
- Содержимое поста: asciidoc, markdown, textile…
</ul></li>
- haml
</ul></li>
<li>Функциональность:
<ul>
- Админ-панель
- Последние обновления
- About
</ul></li>
- Авторизация администратора, запрет редактирования пользователем.
- Предпросмотр.
- Добавление меток (тэгов).
<li>Скрытие сообщений:
<ul>
- Скрытие одиночных сообщений (типы сообщений: приватное, публичное, на главной)
- Скрытие групп сообщений (типы меток: приватные, публичные, на главной)
- Одиночное сообщение без метки приватное.
</ul></li>
<li>Навигационная полоса
<ul>
- “где я сейчас нахожусь?”.
- “куда я могу перейти?”.
</ul></li>
- Слияние нескольких сообщений в одно новое (или в существующее).
- Наиболее часто меняемые?
</ul></p>
Следующие шаги
Куда я вижу развитие этого проекта? Я не уверен, но у меня есть несколько идей на будущее:
- всплывающие подсказки по мере ввода меток (по образцу на Stackoverflow.com)
- фильтрация сообщений по меткам
- implement
sidewiki
Это был сложный, но полезный путь, и я рад продолжить разработку этого блога!