Содержание
Ruby on Rails / Размышления о реализации идеальной CMS
Любимым занятием всех web-разработчиков является написание собственной CMS.
И не важно, создадите вы её когда-нибудь или нет. Важен лишь факт мечты. Стремление. Порыв, пробуждающий в каждом из нас дух гения и архитектора. Но однажды мечты находят средства реализации. И вот тут — все зависит от вас.
Помечтаем?
Делать, так делать! В системе должен быть не один пользователь. Иначе не интересно. Пользователь — ключевое звено каждой системы. К нему привязывается все — профайл, список загруженных файлов, личные сообщения, комментарии. Пользователь — король. И королей будет много!
Способ реализации на выбор:
- authlogic
- restful-authentication
Хочу и всё! У каждого пользователя должен быть поддомен. Ни какой-нибудь там user id, а поддомен! Пусть пользователь чувствует, что он король и у него есть свое личное пространство и даже (!) сайт с личным именем. Сказано — сделано. subdomain-fu
CMS вряд ли заслужит всемирную известность, и принесет миллионы денег, если вы не сможете обеспечить молниеносный перевод вашего детища на десяток-другой языков. Отличная новость! i18n работает с rails по-умолчанию. Просто начните сразу его использовать! СРАЗУ! Перевод на другой язык всего проекта займет час/день, если войдете во вкус с первых шагов. Иначе будет не сладко.
Что будет делать пользователь на сайте? Будем считать, что пользователь у нас сознательный. Ему очень хочется писать, сочинять, создавать. Пользователь — творец. Пользователю нужны страницы для размещения контента. О как!
Не думаю, что кто-то может предсказать сколько будет страниц у пользователя и какой принцип структурирования страниц будет пользователем выбран. Я вижу три варианта.
- Страницы публикуются исключительно по дате создания/публикации
- Страницы имеют структуру списка и пользователь может перемещать их вверх/вниз
- Страницы имеют структуру дерева — страница может содержать дочерние страницы
Первый вариант интереса не представляет. Поля created_at, updated_at есть в каждой rails модели.
Второй вариант интересней. Тут нам поможет acts_as_list
Третий вариант самый интересный. Тут нам поможет NestedSet. Мне видится, что использование вложенного набора является наиболее хорошим решением. Хотите — используйте. Не хотите — ваше дело. Скрыть от пользователя кнопку «создать дочернюю страницу» легче легкого, но отставив NestedSet вы защитите себя от случайной блажи заказчика. Кроме того, частный случай дерева, состоящий только из корневых элементов, вполне обеспечит функционал списка. Конечно, стрелять пушкой по воробьям не логично, но… блажь заказчика, вы не забыли о ней?
Отдельное спасибо простым Российским разработчикам: skyeagle (Anton Orel) за актуальный форк awesome nested set и моему бывшему коллеге, пользователю vorbiz за недавние коммиты, которые вошли в текущий релиз skyeagle/nested_set и несколько его улучшили.
Разметка контента страниц
Кхе-кхе. Как бы вам сказать об этом по-мягче. Пользователи — такие пользователи! Они не знают даже HTML. Еще страшнее, если эти пользователи — рядовые работники бюджетных структур. Забудьте про HTML. Прошу вас. Заклинаю! Wiki-синтаксис или нечто подобное? Не рассматриваю как вариант.
Я верю только в textile и его имплементацию для ruby redcloth. И то, я верю только в самые простые формы textile. Звездочка (*) для жирного начертания, нижнее подчеркивание (_) для курсива и заголовки (хотя, судя по опыту — заголовки это уже тяжело). Оформлять ссылки на сайте предоставим исключительно внутреннему парсеру. Нужен чистый html? Варианты вставки чистого html предусмотрен — будьте спокойны.
Если вы задумываетесь о картинках или вставке ссылок на файлы… Об этом мы еще поговорим чуть позже при организации файлового хранилища.
Редактор для контента страниц
Буду краток: markitup. Аяксовый пред-просмотр можно сделать самостоятельно за 10 мин. (включая отладку).
Черновик, опубликовано, заблокировано
Да. Страница должна обязательно иметь возможность находится в различных состояниях. Черновик, опубликовано — понятно, пользователь решает сам. А вот из состояния «заблокировано», наверное, страницу может вывести только модератор сайта, который, вероятно, это состояние странице и установил. Вы еще беспокоитесь о реализации различных состояний объекта? Спокойно! Всё украдено придумано до (для) нас. state_machine
Ах! Эти непокорные html-теги
В rails 3 предусмотрена автоматическая замена html-тегов на эквиваленты при выводе на страницу (если вы сами не определите иного). Но, часто мы хотим чтобы отсутствовал даже сам факт наличия html-тегов в контенте некоторых пользователей (дружно вспоминаем сами знаете какой сайт). Как быть? Да что за вопрос? Легко! sanitize — обеспечивает whitelist фильтры для вашего контента. Т.е. пропускаться будут только те теги, которые вы разрешите в файле конфигурации sanitize. Можно контролировать и атрибуты тегов.
Программный код в контенте страниц IT-шников
Уверен, что написать свою простейшую регулярку, обеспечивающую textile-стиль для вставки программного кода с указанием языка программирования — это мутное минутное дело. JS-решения highlight.js и SyntaxHighlighter давно известны.
А теги для страниц?
Если честно, то я не очень люблю теги. Вероятно из-за того, что в пору дикого web 2.0 их совали везде и всюду. Теги были одним из главных атрибутов web 2.0 проектов — нет тегов — значит не web 2.0. Но теперь, кажется, эта пора прошла, страсти успокоились — и я признаюсь — да, удобно. acts-as-taggable-on. Использовать легко, теги полиморфны, а значит можно использовать практически для для всех объектов. Использовать строго по рецепту!
А комментарии будут?
Организацию полиморфных комментариев (т.е. тех, которые можно прикреплять к любым объектам) можно подсмотреть в acts_as_commentable. Устроены они так просто, что я бы советовал самостоятельно написать код для них и не забывать об использовании textile и sanitize.
Поскольку я против излишних требований к регистрации, то я бы сделал пред-модерируемые комментарии, а от пользователя попросил бы только ввода такой или в крайнем случае такой капчи. Зачем требовать регистрации для того, чтобы оставить комментарий? Но, если сайт серьезный, то пусть пользователь видит свой комментарий (по куке), а для всех других на нём (комментарии) будет гордо красоваться «ожидает модерации».
Древовидные комментарии? Я уже рассказывал о NestedSet
Оцените меня!
О, эти пользователи! Они так любят, когда страницы с их контентом оценивают положительно и так расстраиваются, когда рейтинг их контента ползет вниз. Заморочьте своих пользователей системой оценок с acts_as_voteable (оригинальная идея тут). Такое же элементарное и полиморфное решение, как и решение с комментариями. Я бы настоятельно рекомендовал реализовать самостоятельно, подглядывая в оригинал.
Оценки добавляем и к страницам, и к комментариями, и к… короче, хозяин — барин.
Листая страницы…
Я не знаю то, как будут у вас реализованы страницы, но факт в том, что перебирать различные элементы вы будите постоянно — вам требуется постраничный вывод (и не только страниц, но и пользователей, файлов и бог знает чего ещё). Вопрос пагинации решен давно и основательно — will_paginate
Хранилища по сути своей выполняют лишь функцию категорий для файлов. Мне кажется удачной идея создавать хранилища с различными именами под разные типы файлов. Хранилища назовем примерно так: Картинки, Текстовые документы, Презентации, Фото, Архивы, Таблицы и т.д. А вот в самих хранилищах будут находится загруженные файлы.
Загрузку файлов предоставим paperclip. Будьте бдительны, не все версии paperclip одинаково полезны.
Что особенного с файлами? Ах, да! Самое-то главное: очень хочется, что бы пользователь мог загружать в свои хранилища файлы любых типов, но вот для изображений желательно делать превьюшки. Paperclip можно относительно легко этому научить, а на странице просмотра загруженных файлов просто сделаем просмотр изображений через lightbox или fancybox
Особую актуальность для всей системы в целом (ввиду использования textile) имеет указание кодов для вставки рядом с отображением загруженного файла. Как это может выглядеть? Ну, например так:
Самые тяжелые элементы разработаны. Все прочее — по своей сути — комбинация вышеизложенных элементов. Закончив первую часть работы можно приступать к реализации:
- форумов
- сообщений
- профайла
- соц. графа (я уже рассуждал об этом)
- многого другого
Элементарно!… почти…
Устанавливаем sphinx.
Используем thinking-sphinx. Настраиваем. Индексируем нужные элементы нашего сайта. Выполняем поиск согласно инструкции thinking-sphinx.
Кстати, sphinx использует для индексации небольших изменений на сайте, так называемую, дельта-индексацию. И чтобы sphinx искал в вашей системе наиболее актуальную информацию требуется периодически эту самую дельта-индексацию проводить. Вопрос в том, как это сделать? Реализуется это достаточно просто с использованием ts-datetime-delta или ts-delayed-delta. Как работать со вторым инструментом, если честно, я так до конца не разобрался, а вот первый инструмент ts-datetime-delta — мне более понятен.
Суть в том, что ts-datetime-delta предоставляет для использования консольную команду rake thinking_sphinx:index:delta, которую нужно периодически выполнять. Но как это делать в автоматическом режиме? Обычно для этого используется cron, но я лично довольно смутно помню как его настраивать (ну, или делать это просто лень). Поэтому лучше использовать whenever. Да, тот конфигурационный файл, который производит whenever не всегда выглядит идеально, но зато, позволяет мне не отрываться от руби-контекста и формулировать мои пожелания к cron на руби без изучения тонкостей работы конфигов cron’a.
Несомненно, вы не получите удовлетворения от разработки, пока не увидите, что в вашей системе работают несколько десятков/сотен/тысяч пользователей и они уже создали тысячи страниц контента и оставили тысячи комментариев к интересным материалам, и выставили миллионы тонн оценок всему, чему только можно.
Жаль. Но только единицы разработчиков однажды увидят то, как работает их система с таким количеством контента. НО! Мы и есть те единицы!
Сотни пользователей и тысячи страниц — сделать это все очень просто с использованием стандартных средств rails: rake или (ныне входит в моду) thor.
За нами останется только написание нескольких несложных скриптов для заполнения тестовых данных и выполнение одной/нескольких консольных команд. Для формирования тестовых пользователей желательно использовать faker, который позволит создать множество случайных имен, адресов, номеров телефонов и email’ов.
Тестирование. Странный, но будоражащий сердца и умы мир.
Тестирование здесь уже обсуждалось.
Как? А разве мы уже закончили? Мой рассказ, думаю, да — заканчивается. А вот ваш рассказ, еще только начинается. Будет здорово, если вы всё же освоите git, хотя бы на уровне отправки ваших наработок на github. И, я уверен, однажды, слава wordpress, joomla, drupal, #{CMS_NAMES} померкнет по сравнению с вашей #{IDEAL_CMS_NAME}.
P.S.: Думаете забыл? Нет! current_user.is_admin? подойдет? Моя точка зрения на это уже сформулирована поэтом.
А теперь сюда и работать.
С уважением, тот самый школьный учитель.
Источник: habrahabr.ru,
получено с помощью rss-farm.ru
Лучшие безголовые CMS для Rails
Back to Integrations
Share на Facebook
Поделитесь на LinkedIn
Поделиться в Twitter
Поделитесь по электронной почте
с мощной безголовой CMS.
Strapi с открытым исходным кодом, настраиваемый и самодостаточный, предоставляет интуитивно понятную панель администратора, а также расходный API от любого http-клиента.
Самый простой способ управлять своим контентом
Легко создавайте структуры контента, которые гибки в соответствии с вашими потребностями. Независимо от того, какая структура данных лучше всего подходит для вашего бизнеса, вы можете легко определять модели и добавлять отношения для создания богатого макета.
С легкостью пишите, редактируйте и управляйте любыми типами контента.
С легкостью создавайте приложения и цифровой опыт, не отвлекаясь на сложности CMS.
Используйте API из Rails с помощью REST или GraphQL.
У Rails много преимуществ
Научиться создавать современные веб-приложения сложно. Ruby on Rails делает это намного проще и веселее. Он включает в себя все необходимое для создания фантастических приложений, и вы можете изучить его при поддержке нашего большого и дружелюбного сообщества.
- Простота управления изменениями : Этот фреймворк наиболее эффективен для долгосрочных проектов благодаря своей стабильности и предсказуемости.
- Безопасный : Некоторые меры безопасности встроены в структуру и включены по умолчанию. Использование Ruby on Rails также означает, что после безопасного жизненного цикла разработки это может быть сложным методом обеспечения безопасности.
- Производительность : Для приложений с большим количеством вычислений или обработки данных Rails может замедлить работу приложения. Если это часто происходит в вашем приложении, взгляните свежим взглядом на оптимизацию кода — это значительно улучшит результаты производительности.
В x существует множество http-клиентов для связи с API Strapi: net/http, httparty или faraday.
Strapi, лучше всего подходит для Rails
Готовые функции Strapi позволяют быстро приступить к работе:
- Одиночные типы уникальная структура контента
- Настраиваемый API : Со Strapi вы можете просто зайти в редактор кода и отредактировать код, чтобы он соответствовал API вашим потребностям.
- Интеграция : Strapi поддерживает интеграцию с Cloudinary, SendGrid, Algolia и другими.
- Интерфейс редактора : Редактор позволяет вставлять динамические блоки контента.
- Аутентификация : Защитите и авторизуйте доступ к вашему API с помощью JWT или поставщиков.
- RBAC : Помогает максимизировать эффективность работы, сократить работу группы разработчиков, защитить от несанкционированного доступа или изменений конфигурации.
- i18n : Управление контентом на нескольких языках. Легко запрашивайте различные локали через API.
Share на Facebook
Share на LinkedIn
Share на Twitter
Поделитесь по электронной почте
. . Так легко настроить. Вам больше понравится контент, который вы создадите с помощью ButterCMS.
Удобная интеграция с Rails
Наша Rails CMS имеет простой API контента и встраиваемый Rails SDK, благодаря которому волшебство происходит за считанные минуты, а не часы.
Действительно не требующее обслуживания решение
С ButterCMS вам больше никогда не придется беспокоиться об обновлениях безопасности, хостинге или производительности.
Мощная CMS для Rails. Ноль головной боли.
Добавьте нашу CMS на основе API в свое приложение Rails за считанные минуты.
ButterCMS предоставляет CMS на основе компонентов и API контента для Rails и приложений Rails. Используйте ButterCMS, чтобы включить динамическое содержимое в свои приложения для содержимого страниц, блогов и всего остального. Большинство клиентов настраивают нашу Rails CMS за один час или меньше.
У вас и вашей маркетинговой команды остается достаточно времени, чтобы заняться тем, что у вас получается лучше всего: создавать потрясающие приложения с потрясающим контентом.
Начните бесплатно
Узнайте, как API Butter позволяет создавать гибкие макеты страниц и легко изменять порядок компонентов без участия разработчика.
Читайте наши отзывы о
ТОЛПА ЛЮДЕЙ
«Лучшая CMS на рынке»
После покупки на рынке стало ясно, что ButterCMS — идеальный выбор. Это позволяет нашим разработчикам создавать мощные компоненты, а нашей маркетинговой команде становится проще повышать качество обслуживания клиентов.
Хэмптон Кэтлин Создатель Sass и Haml
Разверните наш Rails Starter за 30 секунд
Или следуйте приведенным ниже командам, чтобы клонировать копию репозитория с github, установить зависимости, установить бесплатный токен Butter и
запустите свой локальный сервер на localhost:3000/.
# требуется рубин 3.1.0 Клон $ git https://github.com/ButterCMS/rails-starter-buttercms.git $ cd rails-starter-buttercms $ пакетная установка $ эхо 'RAILS_BUTTER_CMS_API_KEY=' >> .env $ bundle exec rails
Узнать больше
Создан для облегчения контент-маркетинга
ButterCMS — лучшая безголовая CMS для Rails по простой причине: разработчики Rails могут создавать решения, которые нравятся маркетологам. Наш API позволяет вашим гуру контента быстро создавать динамические целевые страницы с высокой конверсией, SEO-страницы, маркетинговые страницы продуктов и многое другое, используя простые функции перетаскивания.
-
Целевые страницы SEO -
Примеры клиентов -
Новости и обновления компании -
События + страницы вебинаров -
Образовательный центр -
Страницы местоположения -
И больше. ..
Начните бесплатно
Самая простая CMS Rails, которую вы найдете
Наша простая установка экономит ваше время и деньги. Прокатитесь с нами, чтобы убедиться в этом лично!
Это воплощение простоты plug-and-play для создателей контента. Он делает именно то, что мне нужно.
ЛЮК ГАРДНЕР, СПЕЦИАЛИСТ ПО СОДЕРЖАНИЮ, PRINTAVO
Начните бесплатную пробную версию
Быстрая интеграция с любым приложением Rails
Наша задача состояла в том, чтобы упростить интеграцию Butter с существующим приложением Rails за считанные минуты. Это так просто! Чтобы продемонстрировать, вот небольшой учебник, который даст вам представление о процессе добавления маркетинговых страниц в ваше приложение Rails.
Конечно, вы также можете использовать наши коллекции для расширенного моделирования содержимого. Чтобы получить полное руководство по интеграции, ознакомьтесь с нашим Официальным руководством для клиента ButterCMS Rails API.
Начните бесплатно
Посмотрите, как легко вы можете интегрировать ButterCMS Pages API с вашим приложением Rails.
Компоненты бесшовных рельсов
Расширьте возможности своей маркетинговой команды с помощью динамических целевых страниц, идеально сочетающихся с вашими компонентами Rails.
Компоненты — это основные строительные блоки любого приложения Rails, и ButterCMS легко справляется с ними.
Наш интерфейс перетаскивания упрощает структурирование контента в соответствии с существующими компонентами Rails и создание новых повторно используемых компонентов всякий раз, когда они вам нужны.
One Rails CMS со всем необходимым
Есть причина, по которой так много разработчиков выбирают безголовую CMS Rails. Его легко настроить, он предлагает гибкое, настраиваемое моделирование контента и дает вам доступ к нашему полному API Rails.
-
Пользовательские типы страниц -
Моделирование пользовательского контента -
CDN для активов -
Вебхуки -
Среда тестирования -
Примеры клиентов -
Страницы местоположения
Начните бесплатно
ButterCMS экономит время разработки
Большинство клиентов устанавливают и запускают нашу Rails CMS менее чем за час. Попробуй сам!
Простой, как может быть, с мощными функциями и отличной поддержкой клиентов.
ДИЛЛОН БЕРНС, ВНЕШНИЙ РАЗРАБОТЧИК, KEYME
Начните бесплатную пробную версию
Как интегрировать ButterCMS в ваше приложение Rails
Просто следуйте простым шагам ниже, чтобы завершить интеграцию и начать создавать страницы с помощью Butter. Обязательно ознакомьтесь с нашим полным руководством по созданию страниц с использованием ButterCMS Rails API 9.0033 .
Сначала вы должны настроить новый тип страницы «История клиента» в Butter и создать страницу. После определения вашей страницы API ButterCMS вернет ее в формате JSON, например:
{ "данные": { "слаг": "акме-ко", "поля": { "facebook_open_graph_title": "Acme Co любит ButterCMS", "seo_title": "Кейс клиента Acme Co", "headline": "Acme Co сэкономила 200% затрат на Anvil благодаря ButterCMS", "testimonial": "Мы смогли делать наковальни быстрее, чем когда-либо прежде! - Главный производитель наковальни
\r\nbuttercms.com/NiA3IIP3Ssurz5eNJ15a\" alt=\"\" caption=\"false\" ширина=\"249\"высота=\"249\" />
", "customer_logo": "https://cdn.buttercms.com/c8oSTGcwQDC5I58km5WV", } } }
Чтобы создать эти страницы в нашем приложении, мы создаем динамический маршрут, который извлекает содержимое для страницы с помощью параметра URL. This is how the controllers/customers_controller.rb
file might look:
class CustomersController < ApplicationController
def show
slug = params[:slug]
@case_study = ButterCMS::Page.get('customer_case_study ', slug).data.fields
end
end
Показать результаты в views/customers/show.html.erb
:
<%= @case_study. headline % >
<%= @case_study.testimonial %>