Irwi — Wiki в Rails-приложениях

    Я обнаружил то, что для такой, казалось бы, стандартной задачи как добавлени Wiki-функциональности в Rails нет полноценного готового плагина, которое бы легко интегрировалось с существующим приложением. В связи с этим был написан свой.

    Основными критериями при разработке были:
    • Возможность быстрой интеграции в приложение.
    • Хорошая расширяемость.
    • Отсутствие чужого кода (в смысле кода плагина) в приложении, к чему часто приводит использование генераторов. В этом смысле я пытался равняться на Authlogic.

    То, что получилось представляет из себя что-то среднее между генератором (что обеспечивает хорошую расширяемость и модифицируемость) и engine'ом (чтобы можно было легко обновлять его).



    Установка и использование



    Для работы плагина (в частности истории страниц) необходимо наличие гема diff-lcs. Для форматирования по умолчанию используется RedCloth, однако можно выбрать и другой форматтер. Таким образом:

    gem install diff-lcs RedCloth
    

    Для установки плагина достаточно выполнить в директории Rails-приложения:

    script/plugin install git://github.com/alno/irwi
    

    После установки необходимо сгенерировать миграцию, моделиь и контроллер… Стойте, это вовсе не значит, что у вас в приложении появится куча чужого кода, который непонятно как поддерживать! Контроллер и модель содержат всего по одной строке вида acts_as_* и генерируется для того, чтобы в последствии Вам было бы проще расширять функциональность. Вся собственная функциональность вики реализуется в файлах плагина, что позволяет безболезненно обновлять ее.

    Итак, чтобы сгенерировать необходимые файлы необходимо вызвать соответсвующий генератор:

    script/generate irwi_wiki
    

    После вызова генератора в приложение будут произведены следующие изменения:
    • Добавлен WikiPageController и соответствующий хелпер для обработки страниц
    • Добавлены модели WikiPage и WikiPageVersion для представления страниц
    • Будет сгенерирована миграция, создающая таблицы в БД

    Также в роуты будет добавлена следующая строка:

    Copy Source | Copy HTML
    1. map.wiki_root '/wiki'

    Как несложно догадаться, в ней указывается корень wiki в вашем приложении. Вы можете легко его изменить на тот, который Вам больше нравится.

    Все, работающая вики в вашем приложении сгенерирована. В принципе, можно уже использовать ее, но наверное вам все-таки хотелось бы изменить некоторые ее аспекты под свое приложение, например, изменить шаблоны, используемые для отображения или привязать ее к своей системе пользователей и ограничить права на редактирование страниц. Об этом и пойдет речь далее.


    Изменение внешнего вида



    Изменение внешнего вида можно производить двумя путями:
    • Замена шаблонов
    • Замена стилей в дефолтных шаблонах

    Для замены какого-то шаблона (включая partial'ы) необходимо определить шаблон с соответствующим именем в директории видов для вашего контроллера. Ничего необычного, правда? Если вы не знаете, что же туда писать, можете посмотреть на дефолтные шаблоны в исходниках плагина (они там в app/views), благо они крайне простые.

    Скорее всего, вы будете применять первый способ, но о первом все же стоит упомянуть. По умолчанию в каждый дефолтный шаблон добавляется CSS с описанием дефолтного стиля. Наверное, вам захочется его выкинуть (и подключить свой собственный в layout'е). Для этого достаточно переопределить в хелпере метод wiki_page_style своим, который возвращает пустую строку. Таким образом вы просто уберете стили из страниц.


    Привязка к пользователям



    Что необходимо для того, чтобы привязать вики к существующей системе пользователей в приложении?

    Самый простой случай, если модель вашего пользователя называется User и у вас в контроллере определен метод current_user, который возвращает текущего пользователя. Согласитесь, это достаточно распространенный случай. В этом случае вики автоматически привяжется к пользователям и считать текущего пользователя автором изменений.

    Единственная проблема — на всех страницах имя пользователя будет отображаться как-нибудь вроде User123. Наверное, это все-таки не то, что вы хотите. Чтобы исправить эту ситуацию достаточно определить метод wiki_user в классе WikiPagesHelper. Например, следующим образом:

    Copy Source | Copy HTML
    1. module WikiPagesHelper
    2.   include Irwi::Helpers::WikiPagesHelper
    3.  
    4.   def wiki_user( user )
    5.     user ? link_to( user.login, user_path( user ) ) : "Guest"
    6.   end
    7.  
    8. end

    Если же ваша модель называется как-то по-другому, придется добавить еще одну строчку при инициализации приложения:

    Irwi.config.user_class_name = 'Account' # Разумеется, если ваша модель называется именно так
    

    Я рекомендую для этого создать отдельный initializer, чтобы потом туда же добавлять и прочие опции, которые вы, быть может захотите установить, но в принципе, вы вольны поступать как вам хочется.


    Ограничение прав на выполнение операций



    Скорее всего, Вам захочется добавить ограничение прав на просмотр или редактирование страниц вики (вообще говоря, я считаю, что это весьма неплохая идея). Например, как минимум, дать права на редактирование только зарегистрированным пользователям.

    Для этого необходимо всего-навсего переопределить в контроллере три метода, осуществляющие проверку прав: show_allowed?, history_allowed? и edit_allowed?. В каждом из методов необходимо проверить имеет ли текущий пользователь права на совершение действия (просмотр, просмотр истории, редактирование) с текущей страницей (@page) и соответственно вернуть что-то, что расценивается как исттина или как ложь. В случае, если соответствующий метод возвращает ложь, то действие не совершается и в контроллере вызывается метод not_allowed, который по умолчанию рендерит текст об ошибке, но скорее всего вам захочется переопределить и его (например, чтобы редиректить пользователя на страницу логина).

    Таким образом, примерный код контроллера может выглядеть следующим образом:

    Copy Source | Copy HTML
    1. class WikiPagesController < ApplicationController
    2.  
    3.   acts_as_wiki_pages_controller
    4.  
    5.   def show_allowed?
    6.     true # Показывать всем
    7.   end
    8.  
    9.   def history_allowed?
    10.     true # И историю пусть все смотрят
    11.   end
    12.  
    13.   def edit_allowed?
    14.     current_user # А редактируют только те, кто залогинены
    15.   end
    16.  
    17.   def not_allowed
    18.     redirect_to login_path # Всех нарушителей редиректим на страницу логина
    19.   end
    20.  
    21. end


    Итого



    Я вкратце описал использование своего плагина для вики в Rails. Некоторые моменты, конечно, остались за границами этой статьи, но я опишу их позже. Приветствуются всякие замечания, предложения и идеи (через комменты, github, или любые мои контакты), а также патчи и форки (если кто-то хочет добавить что-то в плагин).


    Исходный код доступен на GItHub: github.com/alno/irwi
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 6

      0
      Итак, чтобы сгенерировать необходимые файлы необходимо вызвать соответсвующий генератор:

      Что-то мне подсказывает, что то, что написано после этих строк не является вызовом генератора…
      Или генератор называется wiki.root и ему передается параметр '/wiki'? =)
        0
        автор явно опечатался
          0
          Спасибо что указали, действительно опечатался. Уже исправил =)
          0
          Есть такая штука как Acts as Versioned
            0
            Не, это немного другое.

            acts_as_versioned позволяет поддерживать различные версии одной и той же модели, что безусловно очень хорошо. Но для того, чтобы на его основе сделать вики, необходимо еще написать контроллеры и простейшие шаблоны.

            В моем случае сразу после вызова генератора и проведения миграций в приложении по пути /wiki находится работающая вики, с примитивным интерфейсом, которая уже затем конфигурируется под конкретные нужды приложения.
            0
            Кстати, если говорить об acts_as_versioned, то еще есть такой плагин как Paper Trail, мне он несколько больше нравится, хотя на вкус и цвет…

            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

            Самое читаемое