Обновить
-1.8

Ruby on Rails *

Фреймворк, написанный на Ruby

Сначала показывать
Порог рейтинга
Уровень сложности

Понижаем уровень связанности с помощью DI для улучшения тестируемости кода, пример реализации

Время на прочтение4 мин
Количество просмотров2K

В началье статьи хочу сразу заметить, что я не претендую на новизну, а только хочу поделиться/напомнить о такой возможности как IoC DI.


Также у меня почти нет опыта написания статей, это моя первая. Я старался как мог, если что не судите строго.


О чем вообще речь


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


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


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


И это очень плохо, потому что модульное тестирование теряет устойчивость к рефакторингу, управлять изменениями в таком коде становится тяжело. Энтропия постепенно растет. А если вы уже боитесь рефакторить свой код, дела очень плохи.


Для решения в подобных задач в мире Java уже давно существует ряд библиотек и нет особого смысла изобретать велосипед, хотя, надо заметить, что эти решения весьма громоздкие и не всегда есть причина их использовать. Рубисты видимо как-то иначе решают подобные задачи, но я, честно говоря, так и не понял как. По этому я решил поделиться как это решил сделать я.

Читать дальше →

Используем SQL в Rails

Время на прочтение8 мин
Количество просмотров6.3K

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


Одна из основных концепций ActiveRecord состоит в том, что база данных достаточно утилитарна и может быть изменена. Ну, вы такие сидите, пишете свои модельки с использованием MySQL и вдруг где-то прочитали, что можно вот так вот взять и заменить MySQL на MongoDB. Хорошо, не так радикально, но, скажем, на PostgreSQL у вас могут быть причины заменить MySQL. Или наоборот, ничего не имею против MySQL. Тут ActiveRecord утверждает, что сделать вам это проще простого, мол скоупы, before/after фильтры и ассоциации достаточно абстрактны, чтобы не переживать за формирование запросов к базе данных и заботится о логике приложения. Что вместо WHERE is_archived = TRUE вы с радостью напишете where(is_archived: true) и ActiveRecord сделает все за вас. Все примеры будут преведены для PostgreSQL, а не для MySQL, так что пользователи MySQL вынуждены будут изобретать свой собственный велосипед.



Но как бы не так! На практике оказывается, что этот слой абстракции вся напрочь дырявая, как корыто из сказки о Золотой Рыбке. И что многие базовые возможности использовать нельзя, вроде сравнения дат или работы с массивами. И получаются скоупы с вынужденными where("#{quoted_table_name}.finished_at >= ?", Date.current) или where("#{quoted_table_name}.other_ids <@ ARRAY[?]", ids). На что ActiveRecord дает вполне осознанный и логичный ответ: не используйте это. Вместо массивов используйте habtm-связь, а если надо сравнивать даты, живите с этим. Да, и не дай бог вам пропустить quoted_table_name в таком скоупе — первый же includes или joins расставит все на свои места. Проще везде и всегда писать, чтобы руку не сбивать.

Читать дальше →

Курс «Языки веб-программирования» (на основе Ruby) от МГТУ им. Н. Э. Баумана на канале Технострим

Время на прочтение14 мин
Количество просмотров22K


В этой статье мы расскажем о курсе «Языки веб-программирования», который читается на кафедре «Компьютерные системы и сети» (ИУ-6) МГТУ им. Н.Э. Баумана. Примеры приводятся на Ruby, а сам курс и представляет собой 16 видеолекций, доступных бесплатно на канале Технострим. В «Бауманке» курс читается для студентов второго курса, уже знакомых с высокоуровневыми языками программирования, такими как Pascal, C++ или Java. Основной акцент делается на системное понимание технологий, используемых в веб-программировании, а не на глубину освоения именно технологий Ruby. Поэтому курс также будет полезен слушателям, имеющим отрывочные знания о веб-технологиях на любых языках.

Сокрытие в Ruby. А ещё скрываем классы из Top-Level

Время на прочтение3 мин
Количество просмотров3.3K

Что бы далеко не ходить, сразу определимся с терминами.


  • Инкапсуляция — упаковка данных и функций в единый компонент.
  • Сокрытие — представляет собой принцип проектирования, заключающийся в разграничении доступа различных частей программы к внутренним компонентам друг друга.

Взято с вики. В языке программирования Ruby с инкапсуляцией вроде как всё хорошо. С сокрытием на первый взгляд тоже, нам доступны локальные переменные, переменные инстансов, разные уровни доступа к методам (public, protected, private). Но иногда этого может не хватать.

Читать дальше →

RubyMine 2018.2: присоединение отладчика к удаленным процессам, chruby, улучшенный анализ кода и многое другое

Время на прочтение4 мин
Количество просмотров3.1K
Привет, Хабр!

Сезон летних обновлений IDE на базе IntelliJ продолжается, и в этой серии мы расскажем, чему новому научился RubyMine в версиях 2018.1 и вышедшей на днях RubyMine 2018.2.


Молчание Ruby-эксепшенов: транзакционный Rails/PostgreSQL триллер

Время на прочтение9 мин
Количество просмотров6.7K

Это история о том, почему вы никогда не должны замалчивать ошибки, когда вы внутри транзакции в базе данных. Узнайте, о том как правильно использовать транзакции и что делать, когда их использовать — не вариант. Спойлер: речь пойдёт об advisory locks в PostgreSQL!


Я работал над проектом, в котором пользователи могут импортировать большое количество тяжёлых сущностей (назовём их товарами — products) из внешнего сервиса в наше приложение. К каждому товару при этом загружается ещё больше разнообразных связанных с ним данных с внешних API. Нередка ситуация, когда пользователю нужно загрузить сотни товаров вместе со всеми-всеми зависимостями, в итоге импорт одного товара занимает ощутимое время (30-60 секунд), а весь процесс может порядочно так затянуться. Пользователю может надоесть ждать результата и у него есть право нажать кнопку «Отмена» в любой момент и приложение должно быть полезным с тем количеством товаров, которые удалось загрузить к этому моменту.

Читать дальше →

Выбираемся из кроличей норы SPA при помощи современного Rails

Время на прочтение15 мин
Количество просмотров11K
TL;DR: Тропа SPA темна и полна ужасов. Ты можешь бесстрашно сражаться с ними… или выбрать другой путь, который приведёт тебя к нужному месту: современный Rails.



Я вспоминаю, как думал, что Rails фокусируется на неправильной цели, когда DHH анонсировали Turbolinks в 2012 году. Тогда я был убеждён в том, что мгновенное время ответа во время взаимодействия с пользователем — это ключ к превосходному UX. Из-за возникающих задержек сети, такая интерактивность возможна, только если вы минимизируете зависимость от сети и вместо сетевых обращений поддерживаете большую часть состояния на клиенте.

Я думал, что это необходимо для приложений, над которыми я работал. И с таким мнением я перепробовал множество подходов и фреймворков для реализации одного и того же шаблона: Single-page applications (SPA). Я верил, что SPA — это будущее. Несколько лет спустя, я не уверен в том, каково же будущее, но я точно хочу найти альтернативу.
Читать дальше →

Рецензия на книгу Сэма Руби, Дэйва Томаса, Дэвида Хэнссона «Rails 4. Гибкая разработка веб-приложений»

Время на прочтение3 мин
Количество просмотров1.2K
В рецензии книга Сэма Руби и др. в основном сравнивается с другой книгой по Rails (первой версии), статьей из английской Википедии, содержанием официального веб-сайта фреймворка, а также еще одной статьей, уже из русской Википедии.
Читать дальше →

Алло, мы ищем фрилансеров: завтра открывается сезон поиска новой работы

Время на прочтение2 мин
Количество просмотров9.2K
С первым днём лета, Хабр! Это не только сезон отпусков (кому повезло с начальством и не приходится отдыхать в феврале), но и лучшее время для поиска работы и новых заказчиков. К тому же, завтра суббота, поэтому, если вы:

  • в Москве,
  • профессионал в Java, C# (.NET), Cloud, C++, Ruby on Rails, Test Automation
  • или менеджер разработки, специализирующийся на SaaS, Java, QA, Ruby on Rails или C# (.NET)

— нет причин не заглянуть на огонёк в коворкинг Gravity на Бауманской.

image
Ужас, который можно будет забыть, перейдя на фриланс

Ровно в девять утра мы начинаем наш очередной турнир для сильнейших менеджеров и разработчиков. Турнир не имеет строгого ограничения по времени (кроме одного — мы о нем расскажем на самом мероприятии), но ориентировочно всех этапы занимают около 5-6 часов.

Оффлайновые турниры Crossover — это глобальные мероприятия, которые проходят в один день по всему миру. Если вы читаете «Хабр» из Киева, Варшавы, Будапешта, Бухареста, Буэнос-Айреса, Стамбула или Сан-Паулу — это значит, что завтра мы проводим турниры и в ваших городах.
Читать дальше →

Saint P Rubyconf 2018: 10 июня, Санкт-Петербург

Время на прочтение1 мин
Количество просмотров1.8K
Здравствуй Хабр и Ruby-сообщество! Спешим сообщить, что уже совсем скоро, 10 июня 2018 года, во второй раз состоится конференция для разработчиков на Ruby и Ruby on Rails — Saint P Rubyconf 2018. Слоган конференции — «Ruby: the best parts». Место проведения — Санкт-Петербург, Корпус ИТМО на ул. Ломоносова, 9.
Читать дальше →

GeekBrains открывает набор на бесплатные курсы подготовки программистов

Время на прочтение2 мин
Количество просмотров15K


Всем привет! Мы открываем набор на бесплатные курсы обучения для Ruby и Frontend-разработчиков. Для участия необходимо пройти конкурс. Пять лучших выпускников пройдут стажировку у нас и останутся работать в офисе. Заявки на обучение принимаются по 17 июня включительно. Подробности набора и программа обучения – под катом.

Читать дальше →

Переиспользуемые UI компоненты в приложениях на Ruby on Rails

Время на прочтение5 мин
Количество просмотров3.5K

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

Читать дальше →

Hello, Rails

Время на прочтение3 мин
Количество просмотров2K
Недавно смотрел по телевизору одну научно-популярную передачу о том, как «климат изменил ход истории». И в связи с этим хочу добавить, что если изменения климата и не были единственной причиной тех или иных исторических событий, то, конечно, и их влияния исключать нельзя.

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

Тогда, небось, вовлеченность какого-либо инструментального программного обеспечения, плода человеческой мысли, в нашу жизнь не менее замечательна. Далее об этом и пойдет речь.
Читать дальше →

Ближайшие события

Ruby on Rails ActionCable+Vue.js v2 на примере чата

Время на прочтение2 мин
Количество просмотров8K

Доброго… Решил поделиться с сообществом опытом интеграции Vue.js v2 и Ruby on Rails на примере разработки чата. Для этого нам потребуется реализация websocket в Rails — ActionCable.


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

Читать дальше →

tdlib-ruby: как сделать Telegram-клиент на Ruby

Время на прочтение4 мин
Количество просмотров14K

image
Одна из особенностей мессенджера Telegram — широкие возможности API (Bot API и Telegram API). Команда Telegram пошла ещё дальше и выпустила библиотеку TDLib (Telegram Database Library), позволяющую разрабатывать альтернативные клиенты Telegram и не задумываться о низкоуровневых деталях реализации (работа с сетью, шифрование и локальное хранение данных).



TDLib работает на Android, iOS, Windows, macOS, Linux, Windows Phone, WebAssembly, watchOS, tvOS, Tizen, Cygwin и других *nix системах, а так же интегрируется с любым языком программирования, поддерживающим выполнение C-функций.


В этой статье мы рассмотрим использование TDLib в Ruby и создание gem'а для взаимодействия с JSON-интерфейсом библиотеки.

Читать дальше →

Анонс ElixirLangMoscow Meetup #7

Время на прочтение1 мин
Количество просмотров1.8K

Клуб ElixirLangMoscow при поддержке Rambler&Co приглашает разработчиков, тимлидов и всех, кто так или иначе связан с разработкой на Elixir, принять участие в ElixirLangMoscow Meetup, который состоится 15 февраля в 19:00, в четверг, в баре «Дорогая, я перезвоню».
Читать дальше →

Я ненавижу константы в Ruby

Время на прочтение3 мин
Количество просмотров10K

Ruby — очень сложный язык программирования. Он невероятно красивый и читабельный, однако у него есть множество тем и особенностей, которые могут оставаться "темным лесом" даже для опытного Ruby-разработчика. Одной из таких тем является поиск констант.


Несмотря на заголовок, гнева в посте не будет.

Читать дальше →

Реализация асинхронной защищенной системы связи на основе TCP сокетов и центрального OpenVPN сервера

Время на прочтение13 мин
Количество просмотров2.4K
В этой статье я хочу рассказать, о моей реализации мессенджера с двойным шифрованием сообщений на основе tcp сокетов, OpenVPN сервера, PowerDNS сервера.
Суть задачи — обеспечить обмен сообщениями через интернет минуя NAT между клиентами на различных платформах (IOS, Android, Windows, Linux). Также необходимо обеспечить безопасность передаваемых данных.
Читать дальше →

Stimulus 1.0: скромный JavaScript фреймворк для HTML, который у вас уже есть

Время на прочтение6 мин
Количество просмотров14K

От переводчика: Давид Хейнемейер Ханссон написал небольшой текст о том, почему он и его команда Ruby on Rails разработала свой собственный Javascript фреймворк. Оригинал текста размещен в репозитории нового проекта


обновлено 4 февраля: оригинал статьи был официально опубликован в блоге Basecamp. Обновил ссылку на оригинал и название


Мы пишем много Javascript в Basecamp, но мы не используем его для создания "JavaScript-приложений" в современном смысле. Все наши приложения рендерят HTML на стороне сервера, затем мы добавляем вкрапления Javascript, чтобы оживить их.


Это путь величественного монолита. Basecamp работает на множестве платформ, включая нативные мобильные приложения, с единым набором контроллеров, представлений и моделей, созданных под Ruby on Rails. Иметь общий интерфейс, который обновляется из единого места, — это ключ к тому, чтобы маленькая команда работала хорошо, несмотря на множество поддерживаемых платформ.


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

Читать дальше →

RubyMine 2017.3. Более быстрая IDE, WSL, Embedded Puppet, и многое другое

Время на прочтение5 мин
Количество просмотров3.7K
Здравствуй, Хабр! Как можно заметить по последним постам в блоге JetBrains, многие продукты компании находятся в стадии заключительных релизов в этом году.

В этой серии мы расскажем про новую версию IDE для Ruby и Rails, RubyMine 2017.3.


Вклад авторов