Программирование на Ruby - Новости

Ruby Hacking Guide

Ruby Hacking Guide - это книга для тех, кто интересуется устройством интерпретатора Ruby (официальная С-версия интерпретатора).

Оригинальная версия книги написана на японском, но сейчас ведется работа по переводу ее на английский.

Читайте Ruby Hacking Guide на ruby-hacking-guide.github.io

Источник: rubyflow.ru

Предзагрузка JS-ассетов с помощью директив Sprockets

Sprockets::Preload – маленький гем, расширяющий возможности Sprockets по загрузке JS. С помощью новых директив, ассеты можно отправить в параллельную загрузку, показывая в этот момент пользователям прогресс скачивания.

Источник: rubyflow.ru

Конференция RuPy 2013

Какие у вас планы на 11-13 октября 2013?

Шестая по счету конференция RuPy будет проходить в это время в Будапеште.

RuPy - это конференция, организуемая сообществом разработчиков.

Разработчики, использующие Ruby, Python, JavaScript, Clojure, соберутся вместе чтобы обменяться опытом и идеями, научиться чему-то новому друг у друга.

Тема конференции в этом году звучит как "On the edge": как мы сочетаем стабильность технологий прошлых лет с новыми разработками.

RuPy - это необычная конференция, состоящая из ряда выступлений. Это целое событие. Это настоящий фестиваль программирования, где разработчики могут знакомиться с новыми людьми, обмениваться опытом и отлично проводить время. Здесь будут кодинг-сессии, вечеринки, еда и напитки.

Первый день будет посвящен вокршопам, а оставшиеся два дня выступлениям. Вечером в пятницу и субботу будут проводиться вечеринки, где вы сможете пообщаться с участниками конференции в неформальной обстановке.

Приезжайте в Будапешт в октябре! :)

Больше информации о конференции RuPy можно узнать на официальном сайте - http://13.rupy.eu/
Следите за новостями в блоге (http://blog.rupy.eu/) и твиттере (@RuPy)

Источник: rubyflow.ru

TheRole Ролевая система для rails4. Релиз 2.1.0

Сегодня добавил метод массовой проверки ролей в гем TheRole. Поэтому случился релиз версии 2.1.0

Всех заинтересованных приглашаю ознакомиться с описанием релиза.

TheRole 2.1.0 release note

Источник: rubyflow.ru

Интересный паттерн под названием Page Object

Паттерн Page Object предполагает использование класса-посредника между пользовательским интерфейсом страницы и тестами, работающими с этим интерфейсом.

Рассмотрим на примере сценария для Cucumber. Обычно описание шага выглядит так:

# features/step_definitions/user_steps.rb

Given /^I login with username "Joseph" and password "cuker"$/ do |username, password|
  visit "/login"

  fill_in :user, user
  fill_in :password password
  click 'login'
end

С помощью Page Object мы можем "скрыть" весь UI страницы и действия с ним за интерфейсом класса.

# features/step_definitions/user_steps.rb

Given /^I login with username "Joseph" and password "cuker"$/ do |username, password|
  login_page = LoginPage.new

  login_page.visit
  login_page.login(username, password)
end

Таким образом, мы скрыли детали реализации UI. Код класса LoginPage выглядит так:

# features/pages/login_page.rb
class LoginPage
  def login(user, password)
    fill_in :user, user
    fill_in :password password
    click 'login'
  end

  def visit
    visit "/login"
  end
end

Что нам дает Page Object:

  • простой и читаемый DSL
  • при изменении UI на будет достаточно только поменять класс относящийся к изменившейся странице. Сами тесты останутся без изменений.

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

Если эта тема вас заинтересовала, то советую прочитать статьи:

Источник: rubyflow.ru

Еще одно правило проверки belongs_to ассоциации

Это статья - продожление предыдущей статьи о правилах валидации на присутствие ассоциации belongs_to. На этот раз расскрываются проблемы связанные с nested attributes.

Источник: rubyflow.ru

Валидатор на присутствие ассоциативного объекта belongs_to

Вы когда-нибудь задавали вопросом что валидировать на ассоциации belongs_to в rails: название ассоциации или внешний ключ? Здесь раскрыта эта тема -
http://railsguides.net/2013/07/11/belongs-to-and-presence-validation-rule1/

Источник: rubyflow.ru

Отчет и мысли о конференции EuRuKo 2013

28 и 29 июня в Афинах проходила ежегодная конференция европейских рубистов EuRuKo 2013.

Мы там были, кофе пили, а я старался прокомментировать самое интересное.

Источник: rubyflow.ru

Скажите спасибо! Это ведь шикарно!

Отличный способ сказать спасибо всем тем людям, которые сделали возможными или намного упростили реализацию ваших идей и проектов – https://github.com/gazay/share_some_love

Источник: rubyflow.ru

Продвинутое использование генератора моделей Rails

В этой статье я описал как можно использовать генераторы моделей в rails с пользой - http://railsguides.net/2013/06/29/advanced-rails-model-generators/

Уверен, что многим будет полезно посмотреть хотя бы примеры

Источник: rubyflow.ru

Финальный релиз Rails 4.0

Видать постоянные анонсы новых RC и затянутость релиза усыпили бдительность комъюнити, но вчера это все таки свершилось!

25.06.2012 DHH сам лично написал в блоге о выходе финала Rails 4.0.

Официаный guide.
Описывать фичи нет смысла - уже давно все написано. В посте традиционные благодарности и немного ссылок на книги и касты.

В общем, поздравляю товарищи!

Источник: rubyflow.ru

Легкая верстка в вынужденных местах: хелперы, декораторы, элементы форм

Многие уже знают о том что во вьюхах не рекомендуется использовать логику и вообще какие-либо манипуляции с данными. Для этого подобный код выносят в <a href="https://github.com/drapergem/draper">декораторы</a>, <a href="https://github.com/plataformatec/simple_form/wiki/Adding-custom-input-components">кастомные элементы формы</a>, <a href="https://github.com/apotonick/cells">компоненты</a> и просто хелперы в конце-концов.

Действительно, при таком подходе view-файлы начинают выглядить лучше. Но кастомные элементы форм и хелперы становятся просто невыносимыми.

Но есть простой и элегантный способ как сделать их чище и проще..


К примеру возьмем кастомный элемент формы <code>PriceRangeInput</code>.

class PriceRangeInput &lt; SimpleForm::Inputs::Base
  def input
    output = template.content_tag(:div, class: 'j-price-slider') do
      div = ''
      div &lt;&lt; template.content_tag(:div, class: 'row') do
        row = ""
        row &lt;&lt; template.content_tag(:span, class: 'span3') do
          @builder.input(:min_total_price, label: false, input_html: { class: 'input-small j-min-total-price'})
        end
        row &lt;&lt; template.content_tag(:span, class: 'span3') do
          @builder.input(:max_total_price, label: false, input_html: { class: 'input-small j-max-total-price'})
        end
        row.html_safe
      end

      div &lt;&lt; template.content_tag(:div, class: 'row') do
        template.content_tag(:span, class: 'span6') do
          template.content_tag(:div, class: 'j-slider', :data =&gt; :slider_data) do
          end
        end
      end
      div.html_safe
    end
    output.html_safe
  end
end

</source>
Этот элемент легко вызвать из формы:

= simple_form_for current_search_form, :url =&gt; :search, :method =&gt; "get" do |f|
    = f.input :price_range, :label =&gt; false, :as =&gt; :price_range

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

<h3>Выход есть</h3>

Решение - использовать <a href="https://github.com/gregbell/arbre">Arbre - Ruby Object Oriented HTML Views.</a>

Он позволяет легко использовать верстку в коде, а также создавать повторно используемые компоненты. Arbre рожден в проекте <a href="http://activeadmin.info/">acive_admin</a> и является, по сути, его основой.

<h3>Ближе к делу</h3>

Начнем с добавление помощничка в базовый класс элементов форм. Это один из редких примеров уместного monkey patch.

class SimpleForm::Inputs::Base
private
  def arbre assigns={}, &amp;block
    Arbre::Context.new assigns.reverse_merge(:builder=&gt;@builder), template, &amp;block
  end
end

Теперь можем зарефаторить элемент формы:

def input
    arbre slider_data: slider_data do
      div class: 'j-price-slider' do
        div class: 'row' do
          span class: 'span3' do
            builder.input :min_total_price, label: false, input_html: { class: 'input-small j-min-total-price'}
          end
          span class: 'span3' do
            builder.input :max_total_price, label: false, input_html: { class: 'input-small j-max-total-price'}
          end
        end

        div class: 'row' do
          span class: 'span6' do
            div class: 'j-slider', data: slider_data
          end
        end
      end
    end
  end

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

<h4>Достоинства Arbre</h4>

И так подведем краткое резюме.

  1. Использование <blockquote>Arbre</blockquote> позволяет избавиться от буфера, для хранение генерируемых тегов:

было

buffer = ''
buffer &lt;&lt; template.content_tag(:div, class: 'row') do
  ...
buffer &lt;&lt; template.content_tag(:div, class: 'row') do
buffer.html_safe

стало

div class: 'row' do
...
div class: 'row' do
 ...
  1. Избавляет нас от необходимости применять мусорный <code>content_tag</code> в коде и дает возмжоность прямо указывать необходимый тег:

было

template.content_tag(:div, class: 'row')

стало

div class: 'row'
  1. И самое интересное - компоненты.

<h4>Собственные компоненты</h4>
Удивительное еще и то, что <code>Arbre</code> позволяет легко добавлять собственные элементы и использовать их в любом контексте.

class Row &lt; Arbre::Component
  builder_method :row

  def build(title, attributes = {})
    super(attributes.merge class: 'row')
  end
end

Сразу после обьявления компонент готов к использованию в любом месте arbre-контекста. Теперь вместо:

template.content_tag(:div, class: 'row') do
  ...

можно писать

row do
  ...

а на выходе полчим код:

&lt;div class="row"&gt;
   ...

В общем arbre помогает сделать неизбежное - верстку в коде, более приятным. Рекомендую.

Оригинальная ссылка- http://habrahabr.ru/post/184528/

Источник: rubyflow.ru

Документация к Ruby 2.0 и любым gem-библиотекам в Dictionary.app

Если вы работаете в Mac OS X, то должны быть знакомы с Dictionary.app. Небольшой, но быстрой и удобной программой-словарем.

С помощью gem-библиотеки rubydictionary вы сможете создать словарь документации к Ruby 2.0 или любой gem-библиотеки.

rubydictionary добавляет новый формат документации к RDoc, который позволяет получить .dictionary файл, используемый Dictionary.app.

Пример того, как можно сгенерировать документацию для Sinatra.

  1. Генерируем .dictionary файл

    $ rubydictionary --dict-name=Sinatra --dict-id=com.sinatrarb.Dictionary

  2. Сохраняем полученный Sinatra.dictionary в каталоге ~/Library/Dictionaries/

Один важный момент: для создания своих словарей вам понадобятся Command Line Tools for Xcode и Dictionary Development Kit, которые можно бесплатно скачать с сайта Apple.

Больше подробностей можно узнать в README в репозитории проекта - github.com/priithaamer/rubydictionary.

Готовые словари для Ruby 2.0.0-p195 и Rails 4.0.0rc2 можно найти на сайте разработчика - http://prii.it/blog/rails4-and-ruby2-dictionaries

Источник: rubyflow.ru

Nginx как прокси для Amazon S3 публичных и приватных файлов

Amazon S3 - великолепное распределенное безразмерное хранилище с удобным интерфейсом доступа. Все бы ничего, но долгий SSL handshake, узкий tcp cognestion window, отсутствие SPDY и невозможность маскировать URL не дает использовать S3 в полной мере.

Посмотрим, как решить все эти проблемы https://coderwall.com/p/rlguog

Источник: rubyflow.ru

Rails Email Preview

Rails Engine для предпросмотра и даже редактирования писем в текстовом и HTML форматах.

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

Для начала использования требуется некоторая настройка, поэтому советую читать README в репозитории проекта - github.com/glebm/rails_email_preview.

Источник: rubyflow.ru

Guard::Rubocop

Плагин для Guard, который добавляет возможность проверки стиля вашего кода с помощью rubocop.

Обновляете Gemfile:

group :development do
  gem 'guard-rubocop'
end

Добавляете конфигурацию в Guardfile:

guard :rubocop, all_on_start: false, notification: true do
  # ...
end

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

Репозиторий на GitHub - github.com/yujinakayama/guard-rubocop

Источник: rubyflow.ru

Вход для пользователей