require_gem VS gem — не такой уж и устаревший
Илья • 31 мая 2007 г.
require 'rubygems'
require_gem 'activerecord'
p ActiveRecord
Всё ок:
Warning: require_gem is obsolete. Use gem instead.
ActiveRecord
Теперь попробуем то же самое, но вместо require_gem используем метод gem:
require 'rubygems'
gem 'activerecord'
p ActiveRecord
То ничего не работает:
uninitialized constant ActiveRecord::Base (NameError)
Кто может объяснить сей феномен? Использую Ruby 1.8.5, Rubygems 0.9.4.
Что нового в рейлс: новые rake задачи для базы данных
Илья • 31 мая 2007 г.
Часто бывает, что вы создаёте новый рельсовый проект, несколько моделей для начала и даже пару миграций, но, ничего не спасёт вас от того, чтобы создать базу данных самостоятельно. Теперь же, достаточно только написать rake db:create и всё готово! А если вы хотите наоборот удалить базу данных, то rake db:drop ваш помощник. Но самое интересное начинается тогда, когда вы хотите полностью пересоздать базу данных и перезапустить для неё миграции — rake db:reset и вуаля!
Итак, три новых рейка для баз данных:
rake db:create
rake db:drop
rake db:reset
Ну и, разумеется, вы можете указывать над какой именно базой данных будут производится действия, указывая переменную RAILS_ENV перед запуском рейка:
RAILS_ENV=test rake db:create
Так же, когда вы используете rake db:reset, вы можете указать до какой версии базу нужно мигрировать:
rake db:reset VERSION=15
TextMate Footnotes — увеличиваем продуктивность
Илья • 29 мая 2007 г.
Уже несколько лет работаю на Маке в редакторе TextMate и до сих пор не знал о существовании такой замечательной незаменимой штукенции как TextMate Footnotes. Надеюсь и вы не знали :)
TextMate Footnotes это плугин для рельсов и его нужно устанавливать отдельно для каждого вашего веб-приложения, после чего, когда вы зайдёте в своё веб-приложение через браузер, вы увидите внизу страницы небольшое серое меню с потрясающе удобными ссылками: Controller, View, Layout, Stylesheets, Javascripts. Первые три ссылки откроют для вас прямо в ТекстМейте вьюшку, контроллер или лейаут данного действия, которое вы смотрите в браузере. Это потрясающе удобно! А ссылки stylesheets и javascripts выведут на страницу маленький аккуратный списочек используемых на данной странице стилей и скриптов.
Более того, используя Footnotes, можно просмотреть содержание сессии, куков, params и последние 200 строк логов.
Как всё это выглядит, можно посмотреть на фликре.
В общем, Footnotes позволяют экономить очень много времени и тем самым реально увеличивают продуктивность.
Кстати, идея эта, судя по всему, была взята из фреймворка Seaside, только на сиасайде она ещё круче в несколько раз.
А теперь, заходим в своё супер-крутое веб-приложение, которое не сегодня, завтра изменит весь мир, и устанавливаем плугин TextMate Footnotes:
script/plugin install -x http://macromates.com/svn/Bundles/trunk/Bundles/Rails.tmbundle/Support/plugins/footnotes
Перезапускаем веб-сервер (ну на всякий случай) и смотрим что из этого получилось в браузере :)
Маленький Безобидный Трюк
Дима • 13 мая 2007 г.
Если хочется чтобы
@group = Group.find(params[:group_id])
не вызывало исключения в случае если группа не найдена, то можно сделать так:
@group = Group.find_by_id(params[:group_id])
Мне кажется что во многих случаях это явно лучше чем rescue nil.
Регэкспы для валидаций
Илья • 3 мая 2007 г.
Каждый раз пишу валидации и каждый раз приходится искать в инете регэкспы или писать самому (ну нет…). Спасибо Рику Олсену за наше счастливое детство — теперь для меня эта проблема навсегда снята.
Я откопал в его Мефисто маленький файлик format.rb, в котором описаны все, нужные для валидаций, регэкспы. Теперь этот файлик кочует из одного моего проекта в другой.
Итак, копируем файл в папку lib/ и используем его во время написания валидаций:
Ляпота? :)
Грамотные сообщения об ошибках валидации
Илья • 29 апреля 2007 г.
Представим что у нас есть модель User со следующими валидациями:
class User < ActiveRecord::Base
validates_presence_of :username
validates_presence_of :email
validates_presence_of :password
validates_length_of :password, :in => 6..12
attr_accessor :password
end
Самая обычная модель с самыми обычными валидациями. Вот только, если мы не заполним поле пароль, у нас сработают сразу две ошибки: пароль не может быть пустым и пароль слишком короткий. Абсурд: конечно пароль короткий, ведь его нет!
Решается всё элементарно: добавляем флаг :allow_nil => :true для валидации длины пароля:
class User < ActiveRecord::Base
validates_presence_of :username
validates_presence_of :email
validates_presence_of :password
validates_length_of :password, :in => 6..12, :allow_nil => true
attr_accessor :password
end
Теперь, если пользователь не введёт пароль, то сработает только валидация присутствия, а валидация на длину будет молчать как партизан.
Просто приятная мелочь, которая позволит сделать ваши сообщения об ошибках менее загруженными и абсурдными.
Update: Поправка опечатки.
Belongs_to :counter_cache
Илья • 24 апреля 2007 г.
Как всё-таки иногда полезно почитать чужой код. Особенно, если его писал Рик Олсен ;)
Ковыряясь в Beast, наткнулся на интересную штуку, которую раньше не замечал:
class Topic < ActiveRecord::Base
belongs_to :forum, :counter_cache => true
…
Флаг counter_cache сделан для автоматического сохранения в базе количество ассоциированных объектов. Будет их автоматически наращивать и уменьшать при добавлении и удалении соответственно.
Для того чтобы вся эта красота работала, в таблице бд модели нужно добавить поле с именем типа «#{table_name}_count». Или, если вы хотите собственное название, достаточно просто его прописать вместо true:
class Topic < ActiveRecord::Base
belongs_to :forum, :counter_cache => :super_puper_counter
…
Делается это всё для быстроты. Чтобы каждый раз, когда вам нужно узнать сколько у форумов топиков (к примеру), вам не нужно было бы делать SQL-запрос, считая все топики.
Как приятно узнать что-то новое.
Update: добавил информацию о том, как нужно назвать поле в базе данных
FileMerge — сравниваем тексты в Мак ОС
Илья • 3 апреля 2007 г.
В комплекте с каждый Маком идёт диск XCode Tools. В основном этот пакет предназначен для создания софта для Мак ОС, поэтому многие себе его не устанавливают. А зря, потому что на нём есть несколько очень интересных утилит. В частности, FileMerge:
FileMerge позволяет сравнить два любых текстовых файла и отобразить разницу между ними. Очень удобно при сравнении нескольких ревизий из subversion.
Самое приятно, что приложение сделано в стиле Apple — просто, удобно и эстетично :)
Simple Emptiness
Дима • 31 марта 2007 г.
На днях мне пришла в голову идея которая показалась мне интересной.
Для строк:
"" | "default" # "default"
" \n" | "default" # "default"
" blah " | "default" # " blah "
Для хешей:
{} | {:default => :value} # {:default => :value}
Для других объектов:
false | "something" # "something"
nil | "something" # "something"
true | false # true
{:pi => 3.1416} | {:pi => 3.14159265} # {:pi => 3.1416}
Для массивов работать не будет, у них уже есть метод |, который объединяет два массива удаляя дубликаты.
Также, ещё один недостаток это то, что данный способ не предполагает lazy evaluation, то есть следующий код вызовет и some_method() и redundant_method() при любом условии:
value = some_method() | redundant_method()
А вообще, всё это было сделано для того, чтобы сократить количество строк при следующем действии:
@plan = params[:plan_name].to_s.strip.empty? ? "Not given." : params[:plan_name]
До:
@plan = params[:plan_name] | "Not given."
Ну а потенциально может пригодиться и в множестве других случаев.
Скачать файл с кодом можно здесь: simple_emptiness.rb
У кого есть предложения по поводу того как это можно ещё использовать или улучшить?
Update: по поводу замечания насчет возможного использования метода blank? (из ActiveSupport) вместо цепочки to_s.strip отмечу, что код писался с расчетом на возможное использование и в pure ruby проектах, поэтому решено было зависимости сократить по минимуму.
Что нового в рейлс: новый разделитель для RESTful-урлов
Илья • 30 марта 2007 г.
Ура! Убрали эту уродскую точку с запятой.
Ещё несколько дней назад, при создании такого рестового роута:
map.resources :users, :collection => { :filter => :get }
Генерировался такой урл:
#GET /users;filter
А теперь, в Edge Rails генерируется такой:
#GET /users/filter
Учтите, что в Rail 1.2 урлы по прежнему с точкой запятой, а в Rails 2.0 они окончательно перестанут работать.
Kathy Sierra угрожают
Илья • 27 марта 2007 г.
Death threats against bloggers are NOT ‘protected speech’
…As I type this, I am supposed to be in San Diego, delivering a workshop at the ETech conference. But I’m not. I’m at home, with the doors locked, terrified. For the last four weeks, I’ve been getting death threat comments on this blog. But that’s not what pushed me over the edge. What finally did it was some disturbing threats of violence and sex posted on two other blogs… blogs authored and/or owned by a group that includes prominent bloggers. People you’ve probably heard of. People like respected Cluetrain Manifesto co-author Chris Locke (aka Rageboy)…
Своими руками задушил бы того, кто это сделал.
Что нового в рейлс: ручное подключение хелперов
Илья • 22 марта 2007 г.
Вместо того, чтобы забивать ApplicationHelper сотнями различных методов, только для того, чтобы они были доступны во всех “вьюшках”, лучше создайте несколько отдельных хелперов и вынесите туда часть методов. Так вы упорядочите свой код, сделаете его более читабельным и удобным.
А подключить эти хелперы в своё приложение можно вот так:
class ApplicationController < ActionController::Base
helper "javascript" # Подключаем JavascriptHelper
helper "images" # Подключаем ImagesHelper
end
Или, если вы используете edge Rails, то вот так:
class ApplicationController < ActionController::Base
helper :all # Подключаем абсолютно все хелперы из папки app/helpers
end
Кстати, второй вариант теперь стандартный для всех новых edge Rails приложений.
Как русские издатели уродуют хорошие книги
Илья • 19 марта 2007 г.
Я всегда поражался как русские “дизайнеры” умудряются так изуродовать оригинальный дизайн обложки любой книги. И самое главное — ЗАЧЕМ?
Сегодня наткнулся на очередной пример шедеврального оформления одной очень популярной книги. Самое интересное, что книгу настолько изуродовали, что у меня совершенно случайно получилось заметить, что это на самом деле Defensive Design for the Web от 37Signals! Глаза запнулись о знакомую фамилию Фрайд.
Обратите внимание, что на обложке написаны совершенно другие авторы (Зельдману подфортило), и только если перелистнуть страницу, то можно увидеть настоящих авторов — Jason Friend и Matthew Linderman.
То же самое издевательство случилось и со всеми другими книгами. Например с Don’t Make Me Think Стива Круга:
Второй вариант не то что заставляет думать, он заставляет беспрерывно тошнить. Кстати, там на ярко жёлтом фоне, белыми буквами написано название книги. Только вы его всё-равно не рассмотрите…
Напрашивается один вопрос — за что, товарищи издатели!?
Совет для маководов
Илья • 9 марта 2007 г.
Обалденный совет, позволяющий отключить функцию Safe Sleep у Мака и тем самым сократить время ухода в режим сна в несколько раз.
Прикол в том, что каждый раз когда вы “усыпляете” Мак, он копирует всё содержимое оперативной памяти в файл, чтобы если у вас вдруг во время сна кончилась батарейка, то он мог спокойно выключиться, а потом, когда вы подключите его к сети и нажмёте кнопку ВКЛ, быстренько восстановить содержимое оперативки из этого файла. Это и называется режим Safe Sleep, то есть когда содержимое оперативной памяти сохраняется на винт.
На деле, у меня лично не было ни разу случая, когда садилась бы батарейка и мак был вынужден уходить в Safe Sleep. Более того, даже если это случится и у меня режим Safe Sleep будет выключен (как сейчас), то пусть у меня всё сбросится — мне не страшно загрузить всё заново. Зато каждодневное использование Мака стало гораздо более приятней, потому что засыпает он теперь за три секунды, вместо привычных 10-20. И ещё 2 гига на винте сэкономил, что всегда приятно :)
Новое в рейлс: аннотации кода
Илья • 27 февраля 2007 г.
Новенькая фишка в edge rails. Теперь в коде можно расставлять маленькие заметочки для себя, а потом удобно вывести их все на экран, используя rake.
Например в коде у нас вот что:class Friendship < ActiveRecord::Base
# TODO: Ability to make friends with your eyes closed.
def make_friends
#code here
end
# FIXME: Right now if your friend is Britney you just can't lose her...
def lose_friends
#code here
end
# OPTIMIZE: Contact Hannibal to optimize this method
def eat_friend
#code here
end
end
А потом запускаем rake notes и получаем список всех заметок со всего приложения:
$ rake notes
app/models/friendship.rb:
* [3] [TODO] Ability to make friends with your eyes closed.
* [8] [FIXME] Right now if your friend is Britney you just can't lose her...
* [13] [OPTIMIZE] Contact Hannibal to optimize this method

