Показаны сообщения с ярлыком rails. Показать все сообщения
Показаны сообщения с ярлыком rails. Показать все сообщения

08 марта 2011

Rails 3, virtual attr validations

Давненько собирался написать про валидацию виртуальных атрибутов в моделях Rails, а тут по случаю опробовал Rails 3, наступил на грабли в данном вопросе, так что повод появился.
Зачем могут понадобиться виртуальные атрибуты модели? Затем, чтобы опять же отделить внутренний способ хранения данных от их отображения, например в базе дата хранится как соответствующий тип Date, а на клиенте должна быть представлена в американском формате mm/dd/yy. Вводить её будут так же. Нужно проверять и только потом конвертировать в свой внутренний формат.
Немного о граблях. Были они вызваны тем, что в коде сеттера для такого виртуального атрибута я делал проверку valid? у модели. Модель пропускалась через валидации, некоторые поля модели к тому времени установлены не были (nil), соответственно валидаторы (в частности, один мой собственный) записывали в массив ошибок сообщение, что поле с нулевым значением неверно. Когда приходило время настоящей валидации, эта ошибка сохранялась, и, несмотря на то, что модель уже валидна, она считалась неверной.
А теперь как надо.

class SomeModel < ActiveRecord::Base
validates :v_field, :presence => true, :custom_format => true
before_save :set_attr

def set_attr
self.field = @v_field.convert_to_internal
end

def v_field
@v_field || field.convert_to_formatted
end

def v_field=(val)
@v_field = val
end
end

class CustomFormatValidator < ActiveModel::EachValidator
def validate_each(object, attribute, value)
real_attr = attribute.to_s.gsub /v_/, ''
begin
if( value.length > 0 )
return
else
object.errors[real_attr.to_sym] << (options[:message] || "is not valid")
end
rescue Exception => e
Rails.logger.add(0, e.to_s )
object.errors[real_attr.to_sym] << (options[:message] || "is not valid")
end
end
end

Теперь всё идёт как надо - форматированное значение лежит в отдельном поле, валидация происходит 1 раз после того, как модель полностью установлена, после валидации - конвертация во внутренний формат.

12 октября 2009

Cache money warm-up

С недавнего времени использую в своём проекте Cache money. Вещь хорошая, но, конечно же, есть и недостатки, впрочем, это предмет для форка и багфиксов. Стоит также отметить, что решение может уже и существует среди форков, коих много.
Если у вас всё в порядке с памятью (RAM, I mean), то может возникнуть желание принудительно заполнить кеш по всем индексам всех моделей. Сниппет извлечён из моего Rakefile'а и адаптирован для использования в рельсах. Предупреждение: не тестировалось именно в рельсах и против составных индексов (хотя и предусматривает их использование).

05 июля 2009

ActiveSupport и Logger

NEVER Override Existing Methods.
Never, ever do this. Never override an existing method. Period, full stop, no excuse.
Rails Worst Practices: 13 Coding Nightmares You Should Avoid


Сначала грешил на Camping. А Camping использует ActiveSupport. И вот к чему это приводит.
ActiveSupport весь такой на белом коне приходит и превращает все сообщения стандартного логгера в абсолютно бесполезные puts без какой-либо полезной информации о времени и уровне сообщения. В документации способ отключения этого безобразия либо нерабочий либо нетривиальный - у меня не пошло. Ну так по рукам ему за это!
class Logger; undef format_message; alias format_message old_format_message;end

11 января 2009

Not Rails

Вот вам кусочек кода Rails разработчика, пример того, что бывает, когда в уме Ruby is Rails:

35     def admin
36       unless logged_in?
37         redirect_to home_path
38       else
39         true
40       end
41     end

Сразу видно, что язык как таковой он не знает. Иначе бы назвал функцию "admin?" Но это так, незнание идиом, мелочи. А вот то, что она будет всегда возвращать true (или поднимать exception) станет сюрпризом, если использовать эту функцию в проверках. А всё потому что возвращать она будет статус редиректа как результат unless.
Поэтому надо всё-таки учить Ruby, или иметь кого-то, знающего его, для code review.

23 октября 2008

Rails Rumble 2008

На rubyflow.ru рассказывают, что закончился этот марафон и можно ознакомиться с приложениями-участниками. Несколькими днями ранее я именно так и сделал и должен сказать, что подавляющее большинство из них бессмысленны и бесполезны, то есть УГ. Есть парочка полезных потенциально, и одно, от русскоязычной комманды разработчиков, - безусловно, но именно оно, самое интересное, не закончено, увы.

11 июня 2008

Engine Yard Express

Вот тут вот отличную штуку раздают. По сути - виртуальная машина, укомплектованная для разработки на RoR и Merb (впрочем, доставить гемов никто не мешает).
На самом деле Engine Yard так рекламирует свои слайсы, отдав на пробу полностью функциональный аналог, лишённый главных преимуществ. Однако побочных применений можно придумать множество.

07 февраля 2008

Неграмотные валидации

Типичнейший пример неправильного пользования валидациями:

В первую же неделю своего изучения рельс я увидел скринкаст, как избежать таких ошибок. Возможно, это было что-то из railcast'сов
Так что rubyplus.org я, пожалуй, смотреть не буду.

09 января 2008

The world of ghettos

Наконец-то осилил Rails is a ghetto by Zed Shaw. (Кстати, лет этак через десять я буду выглядеть именно так, если природа соизволит обременить меня усами и бородой. Гитара уже есть ;))
Что тут можно сказать, прочитать интересно, полезно, но никакого открытия он, на мой взгляд, не сделал. О том, как тяжело гулливерам в стране лиллипутов, писал ещё Джонатан Свифт. Остаётся только быть лучшим и взирать на всё свысока. И чётко разделять, что делается для денег, а что - для души. Потому что в любом сообществе можно найти и идиотов и гениев. Посмотрите на хабр, на лор, на каналы IRC. Это тоже гетто. Весь мир состоит из всевозможных гетто. Но не быть ограниченным гетто - в силах и в праве человека.
Be better. Break ghetto.

07 января 2008

then idiots come. ave idiots!

Перед тем, как окончательно засесть за прочтение статьи Rails Is A Ghetto, балую себя различными отзывами о ней, вот например один из них, весьма интересный.
Да, я люблю ruby и изучаю в первую очередь его. Да, в настоящий момент один из проектов, в которых я участвую, подразумевает программирование на уровне СУБД Postgre SQL. И да, всем популярным дистрибутивам я предпочёл Gentoo (если вы можете переварить словосочетание "Linux From Scratch on steroids" - то вы поняли, что это такое). Но сосуществование Rails & Ruby, MySQL & PostgreSQL, Ubuntu & Debian не вызывают во мне столь бурных эмоций ("Fuck you rail0rz, Ruby is not Rails"), коль скоро оно взаимовыгодно. Если развитие сущностей-сателлитов приносит пользу и основе - я за.
Так что ave, idiots!

26 декабря 2007

Rails 101

А цитаты к презентации, подобраны со вкусом.


“I always thought Smalltalk would beat Java. I just
didn’t know it would be called ‘Ruby’ when it did”


Сама по себе презентация полезна для освежения знаний по забытым частям руби и рельсов.

24 декабря 2007

Ещё о text editors over IDEs

Опрос подтверждает утверждение, что разработчики на Rails/Ruby предпочитают текстовый редактор средам разработки. Конечно, нужно помнить, что некоторые редакторы сами по себе почти среды разработки (вспомним, как можно обвешать Vim/Emacs).
Интересный момент - лидер забега. Это уже, похоже, традиция не хуже LAMP - Rails on Mac with TextMate.