Создание моего блога на 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&#8230;
</ul></li>
- haml
</ul></li>
<li>Функциональность:
<ul>
- Админ-панель
- Последние обновления
- About
</ul></li>
- Авторизация администратора, запрет редактирования пользователем.
- Предпросмотр.
- Добавление меток (тэгов).
<li>Скрытие сообщений:
<ul>
- Скрытие одиночных сообщений (типы сообщений: приватное, публичное, на главной)
- Скрытие групп сообщений (типы меток: приватные, публичные, на главной)
- Одиночное сообщение без метки приватное.
</ul></li>
<li>Навигационная полоса
<ul>
- &#8220;где я сейчас нахожусь?&#8221;.
- &#8220;куда я могу перейти?&#8221;.
</ul></li>
- Слияние нескольких сообщений в одно новое (или в существующее).
- Наиболее часто меняемые?
</ul></p>

Следующие шаги

Куда я вижу развитие этого проекта? Я не уверен, но у меня есть несколько идей на будущее:

  • всплывающие подсказки по мере ввода меток (по образцу на Stackoverflow.com)
  • фильтрация сообщений по меткам
  • implement sidewiki

Это был сложный, но полезный путь, и я рад продолжить разработку этого блога!