RDR3R > Простое форматирование дат в Ruby on Rails

августа 3, 2011  |  Published in Ruby on Rails, Ruby on Rails 3

В этой совсем простой статья я расскажу о том как легко и просто можно форматировать дату и время в ваших приложениях на основе Ruby on Rails без использования стороннего кода.

Начну с того, что в Ruby on Rails, а точнее в ActiveSupport в расширениях для Ruby присутствует расширения для класса Date. Полный путь, если что выглядит так: .  Это расширение базового Date содержит в себе константу DATE_FORMATS которая позволяет сохранять форматы даты и времени и давать им имена (DATE_FORMATS является хэшем). Благодаря этому вы можете один единственный раз определив необходимый вам формат повсеместно использовать его в вашем приложении.
Read the rest of this entry »

Tags: ,

RDRubyTutorial > Рубиновые модули

июля 12, 2011  |  Published in Ruby, Основы

ruby modulesОбещал, что RubyDev Ruby tutorial будет закрыт, но не тут то было!
Вы уже должно быть прочитали главу посвященную классам и узнали о наследовании классов. Часто необходимо одмин классом наследоваться от нескольких классов, что называется множественным наследованием, однако Ruby по ряду причин не располагает возможностью множественного наследования. Отсутствие множественного наследования в Ruby несколько не препятствие и не показатель бедности и недостаточной функциональности языка, напротив, отсутствие множественного наследование избавляет программиста от различных проблем связанных с конфликтом имен, в то же время Ruby предоставляет свой альтернативу множественному наследованию — примеси (mixins).

Модули как раз таки и служат для реализации этого самого подмешивания, а также для логического объединения и инкапсуляции(отделения от внешнего мира) кода.

Представим, что ваше приложение на Ruby состоит из нескольких классов, тогда, поскольку приложение является чем-то монолитным, его следует объединить в модуль. Для особо крупных приложений используется сразу несколько модулей, один основной (корневой), который содержит приложение целиком, и несколько которые объединяют части кода приложения по определенному признаку, например в Rails имеетсямодуль ActiveRecord, который хранит весь код реализующий паттерн ActiveRecord для работы с базой данных, модуль ActiveSupport, который включает в себя другие модули, например ActionController, который хранит в себе весь код реализующий контроллеры, сам ActiveSupport отвечает за реализацию VC от паттерна MVC (Model-Viev-Controller, если забыли).

Что такое модуль? — Модуль это просто еще одно пространство имен, коробка, в которую вы укладываете ваш код, для того, чтобы он не путался с другими составляющими программы. Можете представлять модуль как примитивный класс, который лишен некоторых функций. Модули, что подмешиваются в классы называются примесями (mixin), все, что они делают — это просто дают классу в который были подмешаны доступ ко всему своему содержимому.

Read the rest of this entry »

Tags: ,

Работа с файловой системой в Ruby ч. 3: Стандартная библиотека Ruby: FileUtils и Pathname

июля 4, 2011  |  Published in Ruby, Основы

ruby File APIПродолжая серию статей о File IO в Ruby, мы, в этой статье покопаемся в двух компонентах стандартной библиотеки языка Ruby, которые расширяют ядро Ruby IO API: модуль FileUtils и класс Pathname.

Модуль FileUtils

Модуль FileUtils предоставляет интересный подход к манипуляции файлами путем эмуляции множества команд Unix для работы с файлами и большинства их опций (флагов). То, что вы можете сделать командами типа rm -rf и ln -s может быть выполнено соответственно методами FileUtils.rb_rf и FileUtils.ln_s.

Так как они придерживаются синтаксиса знакомого большинству Ruby-программистов они являются очень простыми для понимания, делая список вызовов методов FileUtils очень похожим на сеанс bash. Пример, что приведен ниже демонстрирует эту схожесть:

require "fileutils"

FileUtils.touch(["some_file.rb", "another_file.rb"])
FileUtils.mkdir("code")
FileUtils.mv(["another_file.rb", "../other_file.rb"], "code")

Dir["code/*"]
#>> ["code/some_file.rb", "code/another_file.rb"]

FileUtils.cp_r("code", "bkp")
FileUtils.rm_r("code")

Dir["code/*"]
#>> []
Dir["bkp/*"]
#>> ["bkp/some_file.rb", "bkp/another_file.rb"]

Read the rest of this entry »

Tags: , ,

Работа с файловой системой в Ruby ч. 2: Класс Dir

июня 30, 2011  |  Published in Ruby, Основы

ruby File APIПродолжая серию о File IO API в Ruby, сегодня мы рассмотрим класс Dir.

Класс Dir

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

Read the rest of this entry »

Tags: , ,

Работа с файловой системой в Ruby ч. 1: Класс File

июня 29, 2011  |  Published in Ruby, Основы

ruby File APIRuby обладет очень мощным API для работы с файловой системой, которое позволяет производить очень сложные операции с использованием минимального количества кода, однако множество методов и классов с похожими именами может несколько запутать новичка.

Класс File

Класс File является встроенным в язык классом (поэтому вам не нужно подключать его в файл с вашим кодом), предоставляет методы для самых популярных манипуляций с файлами. Как и многие другие IO-штуки в Ruby, File является подклассом (дочерним классом) IO, в который подмешивается модуль Enumerable. Давайте пробежимся по основам!

Read the rest of this entry »

Tags: ,

RDR3T > Многоуровневые комментарии и не только

июня 10, 2011  |  Published in Ruby on Rails, Ruby on Rails 3

До этого момента, наше приложение представляло собой хаос. В данной главе RubyDev Rails 3 Tutorial мы займемся тем, что придадим нашему приложению монолитный вид. Большая часть работы будет происходить в файлах представлений. Что конкретно в планах на выполнение:

1. Сделать так, чтобы наш проект имел вид более-менее похожий на настоящий блог.
2. Присоединить вывод комментариев к представлению поста.
3. Реализовать вложенные комментарии.

Хочу сказать,что эта глава будет самая насыщенная и сложная по сравнению с уже опубликованными главами, поэтому наберитесь терпения и по ходу чтения где-то записывайте все, что вам не понятно, чтобы после прочтения задать вопросы в комментариях. Не бойтесь показаться чайником, все мы в чем-то чайники и только задавая вопросы человек может стать профессионалом.
Read the rest of this entry »

Tags: ,

RubyDev Ruby Tutorial #7 >Исключительные ситуации в Ruby и их обработка

мая 23, 2011  |  Published in Ruby, Основы

Исключительные ситуации (exceptions) — это ошибки возникшие в вашем коде и которые также представлены в виде специальных объектов. Лично у меня самой популярной ошибкой, благодаря тому, что яне владею слепым набором, является NoMethodError или NameError:

Array.hello
#NoMethodError: undefined method `hello' for Array:Class
#from (irb):3
#from /home/vladimir/.rvm/rubies/ruby-1.9.2-p0/bin/irb:17:in `<main>'

hello
#NameError: undefined local variable or method `hello' for main:Object
#from (irb):4
#from /home/vladimir/.rvm/rubies/ruby-1.9.2-p0/bin/irb:17:in `<main>'

Ниже приведен иерархический список всех стандартных исключительных ситуаций в Ruby:

Read the rest of this entry »

Tags: ,

RDR3T > Логи и Уведомления в Rails 3, ч. 1: Логи

мая 22, 2011  |  Published in Ruby, Ruby on Rails, Ruby on Rails 3, Тестирование

Rails 3 снабжен очень мощной системой уведомлений о происходящем внутри приложения на основе которой строятся логи приложения. Не смотря на то, что уведомления первичны, мы начнем с лог файлов.

Логи — это журнал происшествий в вашем приложении, они основываются на уведомлениях, собственно уведомления и сообщают в подробностях о происшествиях в приложении. Происшествия — это цепочка действий в вашем приложении, которая следует за каким-либо действие пользователя: переходом на другую страницу, отправкой пользователем формы и так далее.

Все логи хранятся в папке ../log/ ваше приложения и записываются в файлы с именем окружения (development, test и production) и расширением *.log. Зачем логи нужны? По логам можно определить что делало приложение в определенный момент времени или увидить ошибки и попытки взлома приложения.

Rails, по умолчанию использует из Ruby StdLib. Давайте сначала расмотрим работу конкретно с этим логером вне контекста Rails.
Read the rest of this entry »

Tags: , , , , , ,

RubyDev Ruby Tutorial #6 > Регулярные выражения (Regular Expressions — RegExp) в Ruby

мая 15, 2011  |  Published in Ruby, Основы

1. регулярные выражения (Regular Expressions — RegExp) — что это?
Регулярные выражения — это очень мощная концепция, суть которой состоит в создании некоторого  шаблона строки, по которому можно производить поиск, проверку, замену, редактирование, разбиение и т.д. строки или ее подстроки.

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

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

Метасимвол — это символ или несколько символов используемые в шаблоне для определения какой-либо вещи.

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

//.class #=> Regexp

Как вы уже догадались, регулярные выражения (шаблоны) заключаются в символы слэшей. Любой набор символов заключенных между прямыми слэшами будет расцениваться интерпретатором Ruby как регулярное выражение. Также существуют другие способы создания регулярных выражений:

%r{regexp here} и Regexp.new(«»)
Read the rest of this entry »

Tags: , ,

RDR3T > Ассоциации и отношения между моделями. Валидация.

апреля 14, 2011  |  Published in Ruby on Rails, Ruby on Rails 3

Я немного изменил планы и в этой статье не будет рассматриваться работа с RSpec, зато написанию спецификаций будет посвящена целая отдельная статья.

Итак, у нас имеется модель User, которая представляет собой пользователя нашего приложения. В данной статье мы создадим модель Post и контроллер PostsController, которые позволят нам ввести в приложение новую сущность и новый ресурс Post. Post представляет собой публикацию в блоге.

Поскольку любая публикация в блоге должна публиковаться от имени определенного пользователя, то нам необходимо определить связь (ассоциацию) между двумя моделями. Поскольку пользователь может иметь несколько публикаций, а публикация только одного автора, то нам следует установить отношение между моделями: User имеет много Post‘ов. Но прежде, давайте создадим модель и контроллер для работы с постами, а для этого создадим специальную ветку в нашем проекте и будем работать в ней:

$ git branch posts

Теперь если вы воспользуетесь командой, то увидите следущий ответ:

$ git branch
* master
posts

Звездочкой отмечена текущая ветка, для переключения на ветку posts следует воспользоваться командой:

$ git checkout posts
Switched to branch ‘posts’

Вы также могли бы создать ветку сразу из git checkout:

$ git checkout -b posts

Теперь, когда ветка posts создана и мы на нее переключились, мы можем заняться разработкой модели, контролера и представлений поста. В прошлой статье я обещал рассказать вам как создавать модели, контроллеры и другие компоненты приложения при помощи других встроенных в Rails генераторов, кроме scaffold. Сразу скажу, что в данной статье мы будем использовать стандартный генератор scaffold так как код генерируемый им нам весьма подходит, хотя код контроллера мы слегка упростим, чтобы он был идентичен коду из контроллера UsersController.

Для отдельной генерации моделей, контроллеров и так далее следует использовать команды:

rails g controller Posts
rails g model Post title:string text:text user_id:integer
rails g migration create_posts
Read the rest of this entry »

Tags: , ,