Tips&Tricks: Превращение строки в константу

сентября 3, 2012  |  Published in Ruby, Tips&Tricks  |  1 Comment

Недавно в статье о Переменных и константах в Ruby я упомянул о том, что из строки можно получить константу используя Kernel.const_get, на что получил в комментариях целых два замечания. Первое касалось того, что следует использовать Object.const_get, вместо Kernel.const_get, а второе касалось того, что нужно учитывать неймспейсы, а потому получение констант из строки несколько сложнее реализовать. Та статья была о другом, потому, я решил добавить отдельную статью в Tips & Tricks о том, как правильно получать из строки константу.

Код выполняющий это действие я решил поместить в метод #constantize, метод называется так же, как аналогичный метод в Rails, и создать для него псевдоним #to_const. Собственно вот его код:

class String
  def constantize
    constants = self.split("::")
    main = Object.const_get(constants.shift)
    constants.inject(main) { |full, nested| full = full.const_get(nested) }
  end

  alias :to_const :constantize
end

Пример работы:

module SuperExtensions
  module MySuperExtension
    class Extension
      def self.hello
        puts "Hello!"
      end
    end
  end
end

klass = "SuperExtensions::MySuperExtension::Extension".to_const
klass #=> SuperExtensions::MySuperExtension::Extension
klass.hello # Hello!

Вот и все! Удачи!

Tags: , , ,

RubyDev Ruby Tutorial > Копирование объектов в Ruby

сентября 3, 2012  |  Published in Ruby, Основы  |  3 Comments

В Ruby переменные — это просто ссылки на объект в памяти. Присваивая переменной значение, вы не самом деле ссылаетесь ей на объект. Присваивая переменной значение — другую переменную вы просто создаете две ссылки на один и тот же объект:

original = {
  :ruby => ["rails", "sinatra"],
  :erlang => ["chicago_boss", "nitrogen"]
}

another_var = original

Одинаковый object_id — значит и переменные ссылаются на один и тот же объект:

original.object_id #=> 72411200
another_var.object_id #=> 72411200

original[:ruby][0] = "Ruby on Rails"
another_var[:ruby][0] #=> "Ruby on Rails"

Для создания нового объекта — копии используют два метода — #dup и #clone. Ниже преведены примеры использования обоих.

Read the rest of this entry »

RubyDev Ruby Tutorial > О переменных и константах

сентября 1, 2012  |  Published in Ruby, Основы  |  6 Comments

Честно говоря я не очень понимаю в чем возникает путаница с переменными в Ruby, однако мне уже не раз задавали вопросы типа: Что такое @-переменная? Что такое @@-переменная? А в чем их разница?

В этой статье я постараюсь рассказать обо всех типах переменных и константах языка Ruby, а на подобные вопросы буду давать ссылку на эту статью.

В Ruby существует 4 вида переменных и константы.

Read the rest of this entry »

Tags: , ,

Интервью с Ильей «Зайко» Зыкиным о его open-source проектах, frontend и backend разработке

августа 4, 2012  |  Published in Интервью  |  2 Comments

Продолжая традиционную рубрику интервью с разработчиками на RubyDev раз приветствовать в нашей виртуальной студии нового гостя — разработчика на платформе Rails — Илью Зайко.

 

Добрый день Илья. Представься пожалуйста читателям RubyDev.

Илья ЗыкинПривет, Владимир! Ну для начала расставим точки над i. Зайко — это не фамилия, а псевдоним. Прозвище Зайко появилось, что называется “шутки для”, на основе , да так и прилипло. На эту тему есть у меня даже фирменный смайл зайца >;0)

По диплому я школьный учитель физики. До того момента, пока не перепрофилировался в Ruby/Rails разработчика я отработал в образовании 5 лет. Только физику не преподавал — с первых дней занимался преподаванием информатики. Сначала в колледже, потом вел частные курсы для школьников при университете. Последние 2 года преподавал в гимназии. Буквально несколько недель назад выпустились ребята у которых я вел информатику в 9 — 10 классах. Рад за них. Говорят последний год информатику вела у них какая-то “грымза” (улыбаюсь).

С момента окончания вуза в 2007 успел поучиться в аспирантуре и послужить лейтенантом в отделе Информационного обеспечения в МЧС РФ (тоже кстати хороший опыт).

В августе 2011 я оставил образование и начал работать удаленно Ruby разработчиком вместе со своим близким другом.

В январе 2012 меня пригласили на постоянную работу в Петербург работать над фронтендом нового проекта по бронированию авиабилетов. Сейчас подобные сервисы очень популярны и востребованы, и очень надеюсь, что у нас все получится.

В свободное время я занимаюсь не только программированием, но и кулинарией. Точнее занимается жена, а я в меру сил ей не мешаю. Мы с женой ведем кулинарный блог — open-cook.ru Где публикуем рецепты домашней кухни, которые может приготовить каждый. Многие разработчики начинают изучение руби и рельса с создания блога или кулинарной книги, но видимо мы с женой пока что единственные, кто решил выпустить наш маленький кулинарный проект в мир. Наша домашняя кухня открыта для вас, уважаемые Rails разработчики, по адресу !

Read the rest of this entry »

Rubydev Magazine

июля 22, 2012  |  Published in Новости  |  12 Comments

Будущее Rubydev, если оно будет, будет светлым. У меня есть следующие идеи по развитию проекта:

1. Не блог, но журнал. Хочу сделать из Rubydev что-то вроде SmashingMagazine, но с ориентацией на backend. Разумеется, будут статьи по frontend технологиям, но это т.с. только 30% от основного контента. Не очень люблю статьи о дизайне и юзабилити, в них очень много воды и очевидных вещей, такое чувство, что их пишут только для того, чтобы инкрементировать счетчик записей и что-бы малоопытные люди могли в комментариях небоясь раскрыть свою малоопытность общаться буд-то специалисты на абстрактные темы вроде каким цветом сделать кнопку для продажи и какой шрифт лучше — serif или sans. Ну и разумеется, новый Rubydev будет написан на Rails.

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

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

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

Для реализации всего этого мне необходим дизайнер, который позже будет по-совместительству ведущим редактором по frontend технологиям. Если вы считаете себя хорошим или крутым дизайнером и frontend разработчиком — присылайте ваши работы или ссылки на них на egotraumatic{a}gmail.com. Если я вам пришлю ответное письмо в течении 2 дней, то это значит, что я заинтересовался вашим соучастием в разработке нового Rubydev.

Tips&Tricks — Безболезненное расширение классов ядра

июля 21, 2012  |  Published in Ruby, Tips&Tricks, Расширения  |  4 Comments

Говорят, что расширение классов ядра (monkey-patching) — это зло. Тут еще некоторые ведут споры касательно того, что считать monkey-patching’ом — добавление новых методов или переопределение старых, но мы обойдем этот спор стороной и сконцентрируемся на том, как это делать безболезненно.
Read the rest of this entry »

Tags: , , , ,

Tips&Tricks — Проверка объявления переменной — массива и вставка нового элемента

июля 21, 2012  |  Published in Ruby, Tips&Tricks  |  3 Comments

Вам наверное знаком такой код:

a ||= []
a << elem

Так вот, вместо нее можно использовать:

a = [1,2,3,4,5]
b = nil

a = Array.new([*a, 6])
b = Array.new([*b, 1])

a # => [1, 2, 3, 4, 5, 6]
b # => [1]

UPD Предложение от Михаила Дитерле в комментариях:

a = [*a, 6]
b = [*b, 1]
Tags: , ,

Tips&Tricks: Пользовательская конфигурация вашего кода (gem’а)

июля 21, 2012  |  Published in Ruby, Ruby Gems, Tips&Tricks, Расширения  |  2 Comments

Часто необходимо пользователям gem’ов позволить настраивать их на свой вкус. Как это сделать — об этом эта маленькая статья.

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

Read the rest of this entry »

Tags: , , ,

Об именах методов

июля 21, 2012  |  Published in Ruby, Основы  |  2 Comments

rubyДавайте выделим несколько наиболее выразительных групп методов:

  1. Методы проверки, они возвращают true или false (методы — предикаты).
  2. Методы копирующие объект и возвращающие его копию предварительно выполнив на ней определенные действия.
  3. Методы преобразования, они изменяют объект для которого применяются (bang!-методы, методы — мутаторы).
  4. Методы основной смысл которых — что-то передать, (я их называю методы — ссылки, к ним относятся, например аксессоры) (методы доступа).
  5. Методы, которые устанавливают значения свойств/переменных (setter’ы)

Чтобы было понятнее о чем я, представляю примеры всех 4 типов методов:

1. Методы проверки (предикаты)

[1, 2, 3].empty? # => false
nil.nil? # => true

Read the rest of this entry »

Tags: , ,

Правильная работа с ActiveRecord

июля 21, 2012  |  Published in Model, Ruby on Rails, Ruby on Rails 3  |  13 Comments

Статья будет иметь несколько хаотичной. В ней я приведу несколько примеров того, что я считаю неправильной работой с ActiveRecord. Что-то в статье — истина последней инстанции, а что-то — субъективное и, возможно, ошибочное мнение автора. Статья ориентирована на тех, кто хоть немного знаком с Ruby on Rails.

Очень популярная ошибка — не использование limit(1) для выборки одиночной записи с использованием where и других методов Quering API. Суть ошибки в том, что Rails не может за вас подумать о том, что вам необходима одна единственная запись, а не все удовлетворяющие условию. В случае, когда вы не используете limit(1) будет выполняться поиск по всей таблице, а не только до первой соответствующей условию записи.

Word.where(word: 'cat')
# Word Load (0.9ms) SELECT "words".* FROM "words" WHERE "words"."word" = 'cat'
# => [records]

Word.where(word: 'cat').limit(1)
# Word Load (0.7ms) SELECT "words".* FROM "words" WHERE "words"."word" = 'cat' LIMIT 1
# => [record]

UPD Вообще не пользуйтесь .limit(1), вместо .limit(1) используйте first, если вам действительно необходим лишь один элемент. Дело в том, что limit(1) возвращает массив с одним единственным элементом, чтобы получить этот элемент нам необходимо вызывать еще один метод — first (Array#first), или обращаться к элементу через индекс — Model.limit(1)[0].

Tag.limit(1).first
# Tag Load (1.6ms)  SELECT "tags".* FROM "tags" LIMIT 1

Tag.first
# Tag Load (0.8ms)  SELECT "tags".* FROM "tags" LIMIT 1

Read the rest of this entry »

Tags: , , ,