Новая книга о Ruby on Rails!!!
Ура товарищи!!! Не прошло и года, а в продаже уже появилась новая книга на русском языке о Ruby on Rails 2.0 от издательства “Символ-Плюс”.
| Путь Rails. Подробное руководство по созданию приложений в среде Ruby on Rails |
|
Называется она ”Путь Rails. Подробное руководство по созданию приложений в среде Ruby on Rails” от Оби Фернандеса. Надеюсь она станет неплохим дополнением к моей небольшой коллекции книг по Ruby и Rails.
Вывод информации в виде N колонок
Нашёл ещё один повод для восхищения Ruby :) Потребовалось мне расположить несколько записей из таблицы с товарами в виде небольшой таблицы размером две на три ячейки т.е. чтобы получился примерно такой результат:
| Таблица с товарами которая мне нужна |
|
Понятно что получить 6 записей из таблицы не проблема, но вот как их сгруппировать по две на ряд чтобы облегчить создание разметки? Я уже было приготовился писать велосипед, но тем не менее меня одолели сомнения: не может быть такого чтобы в Ruby или Rails не было бы какого-нибудь вспомогательного метода который бы умел группировать записи из массива или по крайней мере делать что-то подобное. И сомнения были не напрасными, буквально через несколько минут я наткнулся на метод #each_slice который делал всю грязную работу. Осталось лишь подключить библиотеку require ‘enumerator’ в контроллере и написать примерно такой код:
<table cellpadding="0" cellspacing="0">
<% @products.each_slice(2) do | product_row | %>
<tr>
<% product_row.each do | product | %>
<td>
<%= render :partial => 'product', :locals => {:product => product} %>
</td>
<% end %>
</tr>
<% end %>
</table>
Таким вот образом Ruby сэкономил мне пол часа времени :)
P.S.
Камень в сторону noobkit.com: noobkit.com почему то считает что такого метода не существует.
Начало ноября...

После небольшого отдыха на прошедших праздниках в Питере сразу начался небольшой фрилансерский проект. Этим и объясняется моё затишье в начале месяца.
Писать пока особо нечего т.к. ничего интересного я не делаю и всего-лишь меняю дизайн в приложений. Хотя это приложение меня сильно поразило… поразило тем насколько говёно можно написать приложение на Ruby on Rails. В нём можно встретить все “болячки” которые ни раз и не два обмусоленные в литературе по программированию: дублирование кода, гигантских размеров функции, полотна кода во view-шках, полотна HTML-разметки втиснутые в строки, SQL injection практически в каждом запросе, полотна SQL кода и это ещё не всё. В общем я в тихом ужасе, такого бля№$!ва-кода я не видел уже давно.
Время не властно над ActiveResource

С ещё одной проблемы связанной с ActiveResource начался сегодня день. Оказывается ActiveResource не поддерживает работу с часовыми поясами (временными зонами) т.е. значение которое находиться в config.time_zone не влияет на формат времени в полях класса ActiveResource. При этом REST-запросы возвращают дату с учётом часового пояса установленного на сервере, но судя по всему, при десериализации значение часового пояса теряется и возвращается дата в формате UTC.
Методы update_attribute и update_attributes в ActiveResource
Пока разработчики ActiveResource который месяц пытаются совладать с diff-файлами здесь и здесь и наложить патч который позволит использовать методы ActiveResource#update_attribute и ActiveResource#update_attributes можно воспользоваться немного переработанным мной патчем:
module ActiveResource
class Base
def update_attribute(name, value)
update_attributes(name => value)
end
def update_attributes(attributes)
load(attributes) && save
end
end
end
который нужно положить в каталог <app-root>/config/initializers.
Чёрная магия ActiveResource

Натолкнулся только что на одну неприятную особенность ActiveResource. Как известно ActiveResource позволяет прозрачно подменять ActiveRecord на клиенте и транслировать запросы отправленные ему на сервер при помощи REST где уже и происходит обращение к БД через ActiveRecord. Такое поведение накладывает ряд ограничений на ActiveResource и заставляет его, в некоторых случаях, вести себя иначе чем ActiveRecord.
Несколько строк о потерянном времени или небольшое исследование inputEx

Провел сегодня пол дня пытаясь собрать на базе inputEx небольшой прототип для построения форм. Но в итоге бросил эту затею. Хоть идея этого фреймворка и великолепная, но её реализация пока безумно сырая. Например не удалось заставить полностью востанавливать состояние формы в дизайнере из сгенерированного JSON запроса (сами поля востанавливаются нормально, а вот метка к ним остаётся пустой). К тому же последний релиз сделанный в мае наводит на печальные мысли (хотя в SVN жизь вроде как ещё теплиться).
Получаем exit code в net-ssh

Получение кода завершения команды в net-ssh задача не сложная, но с первого взгляда интуитивно не очевидная (т.к. методы которые выполняют команду не возвращают его, так же нет свойств через которое этот код был бы доступен). Чтобы всё таки получить код завершения команды надо опуститься на уровень ниже.
Для этого потребуется открыть канал и выполнить команду в контексте этого канала и уже после этого из канала можно извлечь информацию о коде завершения. Выглядит это вот так:
Net::SSH.start("host", "login", :password => "password") do | ssh |
ssh.open_channel do | ch |
ch.exec("[ -d #{directory} ]") do | ch, success |
ch.on_request("exit-status") do | ch, data |
exit_code = data.read_long
end
end
end
end
Do you want Firefox to remember this password?

Оказывается чтобы убрать сообщение в котором Firefox предлагает сохранить логин и пароль (а нужно это например на форме создания нового пользователя) совсем не нужно лезть в настройки Firefox и что-то менять в менеджере паролей. Достаточно просто в поле где выводиться пароль добавить атрибут autocomplete=”off”. После этого нехитрого действия сообщение “Do you want Firefox to remember this password?” перестанет появляться после сабмита формы на сервер.
Формат JSON для GridPanel из ExtJS

Решил тут покапаться в ExtJS т.к. давно уже хотел это сделать, и вот теперь посвились время, желание и возможность. И с наскоку наступил на грабли, которые отняли у меня порядочно времени, но решение оказалось безумно простым.
Оказывается в Rails 2.1 немного изменился формат JSON. По умолчанию, для каждой записи добавляется идентификатор указывающий на класс объекта который был сериализован в эту запись. Пример:
...
[{"site": {"name": "Hi-Tech Melancholia", "id": 1}},
{"site": {"name": "RSDN", "id": 2}}]
...
Видите ключ “site”? Если он присутствует, то класс Ext.data.JsonStore не может правильно распознать JSON и, например, как следствие этого, GridPanel, который его использует не выводит данные.
Но, потратив немало врмени, я нашел решение. В файле config/initializers/new_rails_defaults.rb есть параметр ActiveRecord::Base.include_root_in_json который будучи установленный в false, убирает идентификатор класса из JSON получая такой вот результат:
...
[{"name": "Hi-Tech Melancholia", "id": 1},
{"name": "RSDN", "id": 2}]
...
Я не стал приводить весь код JSON-ответов т.к. они довольно длинные. Плюс они немного отличаются от тех JSON-ответов что формирует стандартный метод to_json т.к. я использую плагин ext_scaffold.



