Rails: наши первые контроллер и отображение

В прошлой статье, на самом деле, мы не создавали никакого приложения (-: За нас всё сделали «рельсы» (-: Был создан каталог, в нём созданы какие-то другие каталоги, что-то так как-то покрутилось и заработало. Но!.. мы-то сами ничего не сделали… Сегодня мы сами проделаем кое-какую работу, создадим наше первое приложение, которое по свой мощи и функциональности не уступает всем известной программе «Hello world!» (-:

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

$ ruby script/rails g controller Say

Буковка «g» — это всего лишь сокращение от «generate». Иными совами, данная команда создаёт контроллер «Say» со всеми вытекающими последствиями. Вы должны увидеть следующее:

create  app/controllers/say_controller.rb
invoke  erb
create    app/views/say
invoke  test_unit
create    test/functional/say_controller_test.rb
invoke  helper
create    app/helpers/say_helper.rb
invoke    test_unit
create      test/unit/helpers/say_helper_test.rb

Всё без ошибок, всё пучком (-: На данном этапе нас интересует только один файл — «say_controller.rb«. Контроллер пока ещё пустой, совсем-совсем:

class SayController < ApplicationController
end

Единственное, что пока видно — это то, что наш класс SayController производый о другого класса ApplicationController.

Давайте добавим всего пару строк:

def hello
end

Мы просто добавили метод «hello» в наш класс.

Думаю, самое время сделать паузу и рассказать, как в «рельсах» происходит обработка URL, т.е. той строки, которую мы видем в адресной строке браузера. В двух словах, чтобы было понятно:

http://www.supersite.com/conroller/action/params

Т.е. сразу за доменным именем идёт вызов определённого контроллера («contoller»), потом идёт поиск метода этого контроллера («action»), последняя часть — это параметры, которые передаются в данный метод. Мы раньше уже создали контроллер и его метод, можем запустить сервер и попытаться запросить следующую строку:

http://localhost:3000/say/hello/

Попробуйте набрать в браузере. А увидите вы примерно следующее:

Routing Error

No route matches «/say/hello»
Совсем не то, что ожидалось, да? (-: А в логах сервера должно быть следующее:

Started GET «/say/hello/» for 127.0.0.1 at Sun Sep 05 16:43:35 +0300 2010
ActionController::RoutingError (No route matches «/say/hello»):
Rendered /usr/lib/ruby/gems/1.8/gems/actionpack-3.0.0/lib/action_dispatch/middleware/templates/rescues/routing_error.erb within rescues/layout (1.6ms)

Иными словами — ошибка! Если перевести на человеческий то, что там написано, то «рельсы» не знают, где искать наш контроллер, что отображать и вообще…

Так давайте ж поможем им! Для этого есть специальный файл «config/routes.rb«.  Этот файл достаточно хорошо документирован, так что нам просто надо написать, как и что отображать:

match ‘say/hello’ => ‘say#hello’

Чтоб стало понятнее, то тут написано, что если в адресной строке встречается «say/hello» после доменного имени, то следует вызвать контроллер «say» и в нём метод «hello«. Обращаю ваше внимание на то, что такой синтаксис стал возможет только в третьих «рельсах».

После этого перестартуйте сервер и обновте страницу в браузере. Та-там! Опять не вышло! (-: Лично у меня показывает следующее:

Template is missing

Missing template say/hello with {:formats=>[:html], :handlers=>[:erb, :rjs, :rhtml, :rxml, :builder], :locale=>[:en, :en]} in view paths «/home/user/RoR/demo/app/views»

«Рельсы» не нашли, что же мы хотим отобразить в браузере. Дело всё в том, что при создании контроллера «Say» была создана папка «Say» в директории «views».  Дело ещё и в том, что по умолчанию «рельсам»требуется файл отображение  для каждого метода с тем же названием, но расширением «html.erb«, в нашем случае необходим файл «app/views/say/hello.html.erb«. Давайте создадим этот файл с примерно следующим содержанием:

<html>
<head>
<title>Hello, Rails!</title>
</head>
<body>
<h1>Hello from Rails!</h1>
</body>
</html>

Сохраните его и обновите страницу в браузере. Должны увидеть следуещее:

Hello from Rails!

Если увидели, то всё сделано правильно (-:  Но работает оно ещё несколько неправильно… в следующий раз я расскажу, что и почему.

Сентябрь 5th, 2010 by none | Один комментарий

jQuery Tools: Tabs и Dateinput

Сегодня я расскажу о том, как подружить jQuery Tools Tabs и Dateinput. Для тех, кто вообще не знает, что такое jQuery Tools, советую посетить их сайт.  Если в двух словах, то это достаточно мощная, но в то же время «лёгкая» альтернатива jQuery UI.  С возможностями, документацией и примерами можно ознакомиться на сайте разработчиков, я повторяться не буду.

Начну я с того, что локализировал Dateinput. На сайте приводится пример, как это делается, поэтому я просто сделал всё то же самое, только для русского языка, пользуйтесь:

$.tools.dateinput.localize(«ru»,  {
months:      ‘Январь,Февраль,Март,Апрель,Май,Июнь,Июль,Август,Сентябрь,Октябрь,Ноябрь,Декабрь’,
shortMonths: ‘Янв,Фев,Мар,Апр,Май,Июн,Июл,Авг,Сен,Окт,Ноя,Дек’,
days:        ‘воскресенье,понедельник,вторник,среда,четверг,пятница,суббота’,
shortDays:   ‘Вс,Пн,Вт,Ср,Чт,Пт,Сб’
});

Как видите, ничего сложного. Как вы сами понимаете, это нужно писать в Вашем файле js.

Процесс создания вкладок и, собственно, полей ввода дат достаточно неплохо и доступно описан на самом сайте создателей, поэтому начну сразу с трудностей.  Незадача заключается в том, что при размещении Dateinput-ов на нескольких вкладках, отображаться календарик будет нормально и правильно только на той вкладке, где он впервые вызывается, на всех остальных вкладках Вы его не увидите. Прикольно, да? (-: А происходит это потому, что тело календарика  создаётся в теле той вкладки, где он первый раз раз инициализируется.  Это легко увидеть при помощи Firebug, стоит только поискать  <div id="calroot">.

Мой способ не претендует на какое-то супер-пупер решение и, возможно, он достаточно корявенький, но зато работает (-:

Первое, что я сделал, — это вынес тело календарика (звучит-то как! (-: ) за пределы вкладок:

$(‘#calroot’).insertAfter(‘.contenttab:last’);

Думаю,  знакомым с jQuery, ничего непонятного в этой команде не будет: просто добавляем тело календаря после последнее вкладки. Теперь календарики будут видны на всех вкладках, но на некоторых в совсем в загадочных местах (-: А ведь нам хочется, чтобы в строго определённым месте, рядышком с требуемым полем ввода. Вот тут и заключается некоторая корявость… Каждый календарь придётся объявлять отдельно… если календариков немного, то это не проблема. Хотя мне вот сложно представить, для чего на странице, пусть даже и во вкладках, может понадобится 10 календариков…

Так вот, ближе к делу.  Определяем каждый календарик следующим способом:

$(«#date»).dateinput({
  format: ‘dd.mm.yyyy’,
  firstDay: 1,
  lang:   «ru»,
  onShow: function() {
        position = $(«#date»).offset();
        $(‘#calroot’).css(‘top’, position.top+20).css(‘left’, position.left — 30);
  }
});

Ничего сложного тут нет, основная мысль заключается в том, чтобы принудительно задать координаты для отображения календаря, исходя из координат родительского поля ввода.  Это и делается в функции onShow. Надеюсь, кому-то это окажется полезным и он не потратит много времени, на ступив на мои грабли (-:

Сентябрь 2nd, 2010 by none | Один комментарий

Rails: На старт! Или первое приложение.

В прошлой своей статье я рассказал, как установить Ruby on Rails на Ubuntu 10.04. Сегодня попробуем создать и запустить наше первое приложение. Пусть это будет и простое тестовое приложение, но всё равно наше, родное (-:

1. Для начала одределимся, где будем создавать наши мегаприложения. Я для себя решил, что пусть они все хранятся у меня в домашней директории. Для этого проделаем следующую процедуру:

$ cd

$ mkdir RoR

$ cd RoR

Попытаемся создать приложение:

$ rails demo

А вот тут у нас ничего не выйдет (-: нам выдадут сообщение об ошибке. Дело в том, что в Rails 3.0.0 произошли некоторые изменения и нам необходимо выполнить следующее:

$ rails new demo

На экран будет выведено много всякой информации, но наше приложение будет создано! Точнее будет сказать, каркас нашего приложения, на основе которого можно будет сделать практически любое web-приложение.

Ну что ж, посмотрим, что у нас получилось:

$ cd demo

$ ls -al

итого 84
drwxr-xr-x 13 none none 4096 2010-09-01 00:58 .
drwxr-xr-x  3 none none 4096 2010-09-01 00:56 ..
drwxr-xr-x  7 none none 4096 2010-09-01 00:56 app
drwxr-xr-x  5 none none 4096 2010-09-01 00:56 config
-rw-r—r—  1 none none  154 2010-09-01 00:56 config.ru
drwxr-xr-x  2 none none 4096 2010-09-01 00:59 db
drwxr-xr-x  2 none none 4096 2010-09-01 00:56 doc
-rw-r—r—  1 none none  665 2010-09-01 00:56 Gemfile
-rw-r—r—  1 none none 1632 2010-09-01 00:58 Gemfile.lock
-rw-r—r—  1 none none   40 2010-09-01 00:56 .gitignore
drwxr-xr-x  3 none none 4096 2010-09-01 00:56 lib
drwxr-xr-x  2 none none 4096 2010-09-01 00:56 log
drwxr-xr-x  5 none none 4096 2010-09-01 00:56 public
-rw-r—r—  1 none none  264 2010-09-01 00:56 Rakefile
-rw-r—r—  1 none none 9130 2010-09-01 00:56 README
drwxr-xr-x  2 none none 4096 2010-09-01 00:56 script
drwxr-xr-x  7 none none 4096 2010-09-01 00:56 test
drwxr-xr-x  6 none none 4096 2010-09-01 00:56 tmp
drwxr-xr-x  3 none none 4096 2010-09-01 00:56 vendor

Не стоит пугаться, не со всем из выше приведённого нам придётся иметь дело (-:

Но всё-таки интересно, что же такого тут мы наваяли?! (-: Для этого в поставке Rails идёт свой web-сервер, при помощи которого на локальной машине можно производить все необходимые разрабоки и отладки. Обращаю ваше внимание, что раньше для того, чтоб запустить сервер, необходимо было набрать следующее:

$ ruby script/server

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

$ ruby script/rails server

Нам буде выведена некоторая служебная информация:

=> Booting WEBrick
=> Rails 3.0.0 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2010-09-01 19:09:09] INFO  WEBrick 1.3.1
[2010-09-01 19:09:09] INFO  ruby 1.8.7 (2010-01-10) [i486-linux]
[2010-09-01 19:09:19] INFO  WEBrick::HTTPServer#start: pid=3893 port=3000

Как видно, сервер стартовал без ошибок, поэтому в своём браузере смело набираем адрес http://localhost:3000/ и громко радуемся увиденному (-: «Рельсы» не только установлены, но и работают (-:

Чтобы остановить сервер, нажимаем в шеле Ctrl+C. Вот и всё! На сегодня будет достаточно (-:

UDP: Судя по всему, я всё же какую-то строчку пропустил, спасибо читателям-комментаторам! (-: Судя по их подсказкам, а они её подсмотрели у севера «рельс», перед запуском оного необходимо проделать следующую процедуру:
$ sudo bandle install

Have fun! (-:

Сентябрь 1st, 2010 by none | 9 комментариев

Ruby on Rails

Ну что вам сказать?! Решил я тут немного поизучать «рельсы» (-: Для тех, кто не в курсе, то это фреймворк, основанный на Ruby. Поговаривают, что на «рельсах» быстро и легко создавать сайты, как простенькие, так и достаточно крутые. Вот я на собственном опыте решил это проверить, лишний опыт лишним не бывает (-:

Так как это первая статья, то, что вполне логично, я начну с установки «рельс». Дома у меня основаня рабочая система Ubuntu, кстати, я её разукрасил под MacOS, давольно прикольно (-: Поэтому процесс установки будет касаться только этой системы.

Итак, приступим, смертнички! (-:

1. Для начала обновимся:

$ sudo aptitude update
$ sudo aptitude install build-essential

2. Теперь можно приступить к установке Ruby и разных других вкусностей:

$ sudo aptitude install ruby rubygems ruby1.8-dev libsqlite3-dev

Тут мы попутно ещё установили sqlite — эдакая БД, для удобства. Потом ещё мускуль установим.

3. Думаете можем приступить уже к сборке Rails? А не тут-то было! Ничего у вас не выйдет! Ну по крайней мере у меня не вышло (-: Кому интересно: Ubuntu 10.04.

$ sudo gem install rails

выдаст следующую ошибку:

i18n requires rubygems version >= 1.3.6

Как говорится, приплыли… Но нас этим не испугаешь! Гугл ведь знает всё (-: Необходимо проделатть следующую процедуру:
$ sudo cd /usr/local/src
$ sudo wget http://production.cf.rubygems.org/rubygems/rubygems-1.3.7.tgz
$ sudo tar xzvf rubygems-1.3.7.tgz
$ sudo cd rubygems-1.3.7
$ sudo ruby setup.rb

Вуаля! Теперь можем вернуться к установке «рельс»:

$ sudo gem install rails

Вот теперь всё должно пройти без сучка и задоринки. (-:

4. Давайте для красоты поставим ещё и MySQL:

$ sudo apt-get install ruby-dev libmysql-ruby libmysqlclient-dev
$ sudo gem install mysql

Вот и всё! Ничего сложного. Не верите? Ну тогда проверьте:

5.  $ rails -v
Rails 3.0.0

В принципе, это всё, что я хотел написать для первой статьи про «рельсы».  Единственное, что стоит добавить, так это  напомнить вам, что стоит иногда обновляться. А делается это следующм образом:

6.  $ sudo gem update rails —include-dependencies

А удалить старые библиотеки можно следующим способом:

7. $ sudo gem cleanup

На первый раз достаточно. В последующем я продолжу цикл статей по изучению «рельс».

Август 31st, 2010 by none | 4 комментария

FreeBSD 8.1-RELEASE

Выпуск! Да-да: выпуск релиза 8й ветки! Всем качать и устанавливать! Смотреть на официальном сайте FreeBSD.org. Хотя можно сразу iso.

Июль 20th, 2010 by none | Комментариев нет