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

четверг, 11 августа 2011 г.

Делегирование в RubyOnRails (method delegate in RubyOnRails)


Всем привет!

Сегодня расскажу про метод delegate в RubyOnRails.

Его назначение: позволяет вызывать методы других объектов как свои собственные.

Использовать его просто:
delegate [один или несколько методов], to: => [целевой класс]

[один или несколько методов] - названия методов из целевого класса.
Имена методов записываются как символы или как строки. Несколько методов разделяются запятой.
Пример: :hello, :goodbye, :start, :end
[целевой класс] - название имени класса в который будут делегироваться запросы на вызов метода.
Пример кода:
Есть класс Greeter
class Greeter < ActiveRecord::Base
    def hello()   "hello"   end
    def goodbye() "goodbye" end
  end

Мы хотим в классе Foo делегировать вызов метода hello классу Greeter
  class Foo < ActiveRecord::Base
    belongs_to :greeter
    delegate :hello, :to => :greeter
  end

Тогда вызывая у объекта класса Foo метод hello получим:
  Foo.new.hello   # => "hello"

Если попытаемся вызвать другой метод класса Greeter - goodbye, то получим ошибку.
  Foo.new.goodbye # => NoMethodError: undefined method `goodbye' for #<Foo:0x1af30c>
Это только один из способов использования delegate.
Спасибо за внимание.
Удачи.

пятница, 10 июня 2011 г.

Rails и Heroku.

Привет.

Облачные технологии приходят на помощь всем.
Для разработчиков Ruby on Rails (RoR) есть такой сервис как Heroku. Heroku это PaaS.

Для чего он нужен?
В идеале данный сервис должен упростит процесс разработки и запуска проектов, использующих Ruby on Rails.

Что предлагает Heroku?
Первое предложение заключается в том, что предоставляется среда разработки проектов на RoR, для работы с которой вам понадобится лишь браузер.  Это избавляет от необходимости использования сторонних программных продуктов, предназначенных для программирования на RoR. Плюс этого в том, что в сравнении с другими языками, ограничения, накладываемые Ruby и RoR, могут быть сложнее, чем просто установка и настройка, использование предоставляемой среды разработки утраняет эти ограничения. Heroku хотят предоставить, как профессионалам, так и новичкам, возможность беспроблемной разработки с использованием лишь ПК с браузером.

Второе предложение Heroku позволяет разработчикам размещать (host) их, а так же масштабировать (scale). Heroku использует Amazon Web Services для масштабирования проектов размещающихся у них, и планируют в качестве дополнительной возможности взымать плату за кол-во потребляемых мощностей с платных пользователей, использующих данную услугу. Даже, если вы не желаете разрабатывать свое приложение с использованием Heroku, вы можете просто импортировать ваше приложение, чтобы ощутить всю мощь автоматической масштабируемости, предоставляемой этим сервисом.

Пробуйте.

Удачных выходных.

пятница, 20 мая 2011 г.

Магические имена в Rails.

Привет, друзья!

Уже пятница и не загорами веселье, отдых и магия, но перейдем к тебе поста.

В Ruby on Rails есть список магических слов (Magic Field Names), которые используются системой для определенных нужд. Использование таких же названий может привести к проблемам вида WARNING: Can't mass-assign protected attributes: type.

Вот список этих зарезервированных слов и имен (List of Magic Field Names):
  • created_at
  • created_on
  • updated_at
  • updated_on
  • lock_version
  • type
  • id
  • #{table_name}_count
  • position
  • parent_id
  • lft
  • rgt
  • quote_value (is used for quoting)
  • template
На этом все.
Желаю всем приятных выходных.
Удачи.

понедельник, 14 февраля 2011 г.

Если у вас undefined method `total_pages'.

Опишем ситуацию в общем виде:
Хотим сделать запрос к базе, получить данные и отсортировать их по определенному атрибуту.
Все идет хорошо и вдруг возникает ОШИБКА вида:
ActionView::TemplateError (undefined method `total_pages' for #<Array:0x5e82358>)

Это связано с испоьзованием:
escape_javascript will_paginate @transactions
и
@transactions = @transactions.sort_by { |transaction| transaction.name }

Проблема кроется в том, что Array не имеет метода total_pages.


Для того, что бы все было хорошо делаем так:
@transactions.sort! { |a,b| a.name <=> b.name }

И все работает. Спасибо ресурсу, а также.

четверг, 27 января 2011 г.

Для затравки. О проблемах с Single Table Inheritance.

Описание проблемы: Имеем разные SQL запросы для одного и того же ruby кода. Т.е. один и тотже код исполняется по разному.

Более подробнее поговорю об этом потом, а пока как решается проблема.

Глубокая статья о трудной жизни. (Ценное в комментариях)
When Rails Needs a Clue - Single Table Inheritance Problems

Ну и по этой теме.
When single-table inheritance attacks
Three Reasons Why You Shouldn't Use Single Table Inheritance
Problem with one-to-many relationship with Single Table Inheritance (Rails)
require_dependency

среда, 19 января 2011 г.

Знакомтесь Redmine

Сайт проекта: http://www.redmine.org/
Там можно скачать систему, почитать документацию и т.д.

Что такое Redmine?


Redmine это гибкая система управления проектами в виде web-приложения. Устанавливается на сервере и доступно, через окно браузера. Redmine написан с использованием фреймфорка Ruby on Rails. Эта системя является кросплатформенной "cross-platform" (может инсталированться на разные ОС) и кросбазовая "cross-database" (может инсталироваться под разными базами данных).

Кроме того Redmine открытое ПО с доступным исходным кодом, которое распространяется под лицензией GNU General Public License v2 (GPLv2).

Основные возможности

Перечислим некоторые из основных возможностей Redmine:
  • Поддержка множества проектов;
  • Гибкая работа с ролями в системе доступа;
  • Гибкая система управления задачами;
  • Наличие диаграммы Ганта и календаря;
  • Поддержка системы новостей, управление документами и файлами;
  • Наличие различных систем напоминания;
  • Ведение wiki под проект;
  • Ведение форумов под проект;
  • Система контроля времени исполнения задач;
  • Настраиваемые поля для задач, временных меток, проектов и пользователей;
  • Интергация с различными системами контроля версий (SVN, CVS, Git, Mercurial, Bazaar and Darcs)
  • Создание заданий через email;
  • и т.д.
 
Пример развернутой системы Redmine можно посмотреть здесь: http://demo.redmine.org/.

Всего хорошего.

суббота, 15 января 2011 г.

Кратко о link_to и символах

В основе лежит пост Ruby Symbols

Как очень просто и быстро в view создать линк. Используем erb и link_to (это по "науке" ActionView helper function).
Пример использовыания:
<%= link_to 'link', :action => 'myaction' %>
Вопрос, что здесь такое :action. Это и есть символ (Symbol). В rails символы используются как строки для использования в разных местах. Если будет проще, то они являются "заполнителями" для идентификаторов и строк. 
В качестве примера, будем использовать в качестве имени действия не строку, а символ:

<%= link_to 'link', :action => :myaction %>
Вы наверное спросите: как создать символ?
Для создания символов есть несколько путей.
Приведем пример, как можно создать символ :myaction.
Это можно сделать следующими способами:

<%= link_to 'link', :action => :'myaction' %>
<% myvar = 'myaction' %>
<%= link_to 'link', :action => :"#{myvar}" %>
<%= link_to 'link', :action => myvar.intern %>
<%= link_to 'link', :action => "myaction".to_sym %>

В чем сокральная прелесть симоволов, а в том, когда символ создан, во время выполнения программы в памяти хранится только одна его копия. То есть Ruby, вместо того чтобы делать копию за копией, хранит ссылку на адрес единственной ячейки памяти.
Экономия памяти, господа, ЭКОНОМИЯ!!! =)

Быстренько о FasterCSV

Нужно просто и быстро импортировать или экспортировать в CSV!
На помощь приходит FasterCSV.
Описание и примеры использования по ссылкам:
Код и описание
Документация
Примеры как парсить CSV в Ruby (различные способы)

Если нужны примеры кода в таких постах пишем замечания в сообщениях =)

четверг, 13 января 2011 г.

Пакет RubyGems


Пакет RubyGems - менеджер пакетов для Ruby, предоставляющий возможности манипулирования гемами (gems).
gem - функциональный модуль, написанный для Ruby On Rails.


Часто используемые возможности пакета:
  • текущая версия
gem -v
  • обновление RubyGems на последнюю версию
gem update --system          # необходимо быть администратором или root
  •  поиск гема
gem search postgres -r
  • установка гема
gem install postgres
  • удаление гема
gem uninstall postgres
  • получение списка гемов, установленных локально
gem list
  • получение списка гемов на удаленных серверах
gem list -r
  • возможность использования из Ruby-кода
require 'rubygems'
  • поддержка многоверсионности при администрировании
  • поддержка многоверсионности при программировании
require 'rubygems'
gem 'activerecord', '= 1.4.0'


Дополнительная информация на rubygems.org.

Метаалл! Rails Metal

Пару линков для затравки:
Rails Metal или Rails Metal
Introducing Rails Metal
Rails on Rack

Познаем и радуемся жизни! =)
В светлое будущее!!!!

вторник, 11 января 2011 г.

Ставим nokogiri

Бывает так, что стартуешь сервер: script/server
А он тебе в ответ:
=> Booting WEBrick
=> Rails 2.3.5 application starting on http://0.0.0.0:3000
The following gems have native components that need to be built
  nokogiri  = 1.4.1

Run `rake gems:build` to build the unbuilt gems.

Делаешь rake gems:build
А в ответ:
rake aborted!
ERROR: Failed to build gem native extension.
...
libxslt is missing.  try 'port install libxslt' or 'yum install libxslt-devel'

Выход есть!!! =)

Если у вас Ubuntu делаем так:

# ruby developer packages
sudo apt-get install ruby1.8-dev ruby1.8 ri1.8 rdoc1.8 irb1.8
sudo apt-get install libreadline-ruby1.8 libruby1.8 libopenssl-ruby

# nokogiri requirements
sudo apt-get install libxslt-dev libxml2-dev
sudo gem install nokogiri

Если нужна определенная версия например 1.4.1
sudo gem install nokogiri --version '= 1.4.1'

Если остались вопросы идем: Installing Nokogiri

понедельник, 10 января 2011 г.

Launchy

Что это за зверь: http://copiousfreetime.rubyforge.org/launchy/
Линка на код: https://github.com/copiousfreetime/launchy

Основная идея:
Иногда бывает так, что тест BDD валится, и еще в добавок сложно определить почему, точнее приложенные усилия не стоят потраченного времени. Другое дело, если взглянуть на страницу, на которой тест (например Cucumber) не нашел кнопку «Создать». Для этих целей можно использовать launchy.


Как использовать:
Для начала пишем определенный код.

Например для Cucumber

    Then 'WTF?' do
      save_and_open_page
    end

Дальше в сценарии просто вызываем соответствующий шаг перед тем, который не проходит, и видим в своем браузере по умолчанию сохраненную страничку с формой входа на сайт и надписью «У вас недостаточно прав для выполнения данной операции», или что-то в таком духе.


На основе статьи "Rails: Хватит отмазываться, начинаем BDD-ить!": http://habrahabr.ru/blogs/webdev/111480/