Как запустить приложение rails
И так, мы с вами уже научились устанавливать Ruby on Rails, разобрали самые базовые команды для создания контроллеров и моделей. А сегодня создадим простое приложение, с помощью которого мы сможем разобрать и понять основы работы в Rails. Сложное приложение мы делать не будем, создадим простое To-do приложение со списком задач, а в будущем будем добавлять новый функционал. Все создают менеджеры задач, почему бы и нам не сделать 🙂
Создаем наше приложение командой rails new TodoApp и переходим в появившуюся папку TodoApp , запускаем команду bundle install .
Приложение создано, теперь нам нужно сделать хоть минимальное описание функций, чтобы хоть минимально понимать принцип работы нашего приложения.
И так, с помощью TodoApp мы сможем:
- Добавлять, удалять, редактировать заметки
- Отмечать о выполнении
- Отображать только выполненные или невыполненные задачи
Этого пока будет достаточно. В будущем будем наращивать функционал, тем самым узнаем как легко и просто изменять приложение.
Создание модели
Контроллер и представления
Контроллер нужен для того, чтобы обработать запрос пользователя, выбрать нужные данные и передать их через представление пользователю. Создание контроллера выполняется командой: rails g controller Tasks . Эта команда создаст файл контроллера app/controllers/tasks_controller.rb , в котором мы и будем описывать различные действия. Каждый метод объявленный в этом файле соответствует конкретному представлению.
Поэтому первым делом мы объявим корневое представление, та страничка, которую пользователь увидит зайдя на сайт. Открываем папку app/views/tasks и создаем в ней файл index.html.erb . Запишем в этот файл какой-то текст, не важно, для теста нам хватит. Открываем файл контроллера и объявляем метод с именем index .
Приведя файл к виду:
Файлы созданы, метод есть, однако страница сама не отобразится после того как вы откроете сайт, приложению еще нужно указать какое представление использовать в качестве главной страницы. Откроем файл config/routes.rb и приводим к виду:
Создание формы
Форма для добавления у нас будет очень простой, имеет 2 поля, это Title и Text . Поскольку почти все действия у нас будут происходить на главной странице, поэтому форму мы добавим в файл index.html.erb .
В файле контроллера, отредактируем метод index приведя к такому виду:
Этим мы создадим и поместим объект нашей задачи в переменную и сможем в дальнейшем работать с ней.
Добавляем строчку в файл config/routes.rb :
Ресурс нужен для создания правильных маршрутов для нашего контроллера. Пока с этим заморачиваться не будем, в дальнейшем разберемся подробней.
Перезагрузим страницу и увидим форму, однако добавлять данные в базу она еще не может, для этого нам потребуется создать пару методов в контроллере.
Добавление заметок
Чтобы с помощью нашей формы мы могли добавлять новые задачи, в контроллере tasks нужно создать пару методов. Приводим файл app/controllers/tasks_controller.rb к следующему виду:
Как вы заметили, в методе index я добавил строчку @tasks = Task.all . Она нужна для отображения всех задач на этой странице, если вы хотите все задачи отображать в другом месте, нужно будет добавить такую строку в другой метод контроллера.
Отображение задач
Откройте файл app/views/tasks/index.html.erb и добавьте следующее:
Самый простой вывод информации, оформлением мы заниматься не будем, это вы сможете сделать сами 🙂 В цикле просто выводим название и текст заметки.
На этом я статью закончу, длинной получилась, в следующей статье научимся удалять/редактировать заметки и добавим категории с метками.
В этой маленькой статье, которую с удовольствием прочитал бы сам неделю назад, я попытался собрать все вещи, которые понадобились бы человеку, задумай он «с нуля» написать приложение на RoR. То есть не углубляясь ни в одну из областей, описать необходимый минимум действий, чтобы установить, настроить и написать своё первое приложение.Здесь собрано, как мне кажется, всё, что нужно и я надеюсь этот текст сэкономит кому-нибудь несколько часов поиска в интернете). Сам изучаю RoR вторую неделю, так что не судите строго).
Установка.
Просто и быстро ror ставится через rvm c rvm.io.
*$HOME в дальнейшем.
После этого в $HOME/.bash_profile должна появиться строчка:
и при каждом открытии консоли rvm будет подгружаться, но у меня этого не случилось — пришлось ещё в $HOME/bashrc прописывать:
Проверка на успешность создания
должна вернуть более подробную информацию, вроде
В процессе установки я случайно установил несколько версий, что потом доставило некоторые неприятности). Посмотреть список установленных версий руби можно так:
>rvm list
Если версий несколько, то текущая будет помечена "=>", дефолтная — "*", а текущая и дефолтная — "=*". Поменять на нужную используемую версию можно так:
Чтобы поменять дефолтную версию руби пишем:
Создание проекта.
Теперь можно перейти непосредственно к созданию проекта. Создаём папку $HOME/ROR/tickets, заходим в неё и делаем следующее.
При создании проекта будут сгенерированы все необходимые директории(app,config,db,log и т.п.) и конфигурационные файлы в указанной папке. Для работы небольшого тестового проекта нам потребуется, в моём случае, база данных PostgreSQL, пара gem-ов(библиотек) и запущенный rails сервер).
Для запуска сервера нужно, находясь в корне папки с созданным проектом запустить команду:
где s — команда запуска сервера(server), а -p 3000 -номер порта(port), по которому будет доступен проект. Что бы запустить консоль, нужно набрать:
где с- сокращение от console
Список всех команд можно посмотреть, набрав
>rails --h. Теперь по адресу localhost:3000 мы увидем стартовую страницу проекта. Так же можно запускать любое количество серверов других проектов на других, не занятых портах. В ходе работы. у меня в один момент по какой-то неведомой мне причине возникла проблема с запуском сервера — выдавалась ошибка, что сервер уже запущен — для её решения нужно просто удалить файл $HOME/ROR/tickets/config/tmp/pids/server.pid и запустить сервер ещё раз.
База данных.
Чтобы работать с постгресом, добавляем в конец файла Gemfile, который должен находится в корне проекта, строчку
>gem 'pg'
сохраняем файл и делаем
его мы делаем каждый раз, когда вносим изменения в Gemfile, а потом ещё и перезапускаем сервер. Чтобы сюда больше не возвращаться, сразу же добавляем и
>gem 'haml-rails' для быстрой и удобной(после того как привыкнешь)) разметки шаблонов-представлений. Теперь отредактируем атрибуты конекта к постгресу в файле database.yml. Он находится в папке $HOME/ROR/tickets/config/ и должен будет содержать такой блок:
с нужными пользователем и именем БД, у меня это tickets и tickets соответственно).
Вроде бы все приготовления закончены и можно приступать к созданию модели, контроллера и представления.
Модель.
где g- сокращение от generate
Название модели пишем в единственном числе — таблица в бд будет во множественном. Эта команда создаст файлы модели и миграции в $HOME/ROR/tickets/app/models/user.rb и $HOME/ROR/tickets/app/db/migrate/20130425081208_create_users.rb. все файлы контроллеров и моделей имеют расширение .rb, представлений — .html.haml(в нашем случае использования haml). Посредством миграции мы будем управлять работой с таблицами в БД через консоль, что весьма удобно(опять таки, когда привыкаешь), так же ониобеспечивают простоту переноса приложения, на другой сервер, например. Добавляем нужные поля:
Создаём два метода — up и down, которые используются по умолчанию функциями работы с миграциями — они, соответственно, создают и удаляют нашу таблицу. Названия типы данных будут зависеть от используемой БД. Первичный ключ создаётся по умолчанию и будет называться id, но его можно задать и явно:
А если мы не хотим создавать первмчный ключ вообще, пишем так:
Сохраняем и пишем в консоле:
В результате действия этой команды выполняются все невыполненные методы up из файлов миграций в директории $HOME/ROR/tickets/app/db/migrate/. Все сведения о состоянии таблиц можно посмотреть в файле $HOME/ROR/tickets/app/db/shema.rb.
Запускает метод down последней выполненной миграции, в результате чего таблица удаляется из БД. Чтобы откатить больше миграций, нужно добавить к команде rollback параметр STEP:
эта команда откатит три последние миграции. Посмотреть статус всех миграций в консоли:
Если нужно запустить какой-то определённый метод из определённой миграции, то добавляем параметр VERSION:
В файле модели ($HOME/ROR/tickets/app/models/user.rb) нам пока нужно сделать только одно — определить поля таблицы, которые будут доступны для изменения из контроллера, в целях безопасности, как я понимаю). Для этого пишем в нём следующее:
Кстати, синтаксис haml очень чувствителен к табуляциям — их очень хорошо можно отслеживать в редакторе, которым пользуюсь я — Sublime Text.
Пока приложение не работает, для того, чтобы удостовериться, что все созданные таблицы действительно созданы и функционируют как им и положено, можно воспользоваться раилс консолью:
эта команда не сделает запись в таблицу, но создаст объект руюи в памяти со всеми установленными атрибутами. А теперь сделаем запись:
в случае успеха должна вернуть true. Запись можно создать и одной командой — create:
Чтобы проверить есть ли объект в БД, можно использовать find:
вернёт объект или ошибку: «ActiveRecord::RecordNotFound: Couldn't find User with а так же и сам сгенерированный sql-запрос к БД.
Искать можно и по конкретным полям:
Ещё несколько удобных методов, которые наверняка пригодятся на первых порах:
>User.first и User.last -вернут первую и последнюю запись в таблице соответственно, а User.all вернёт массив всех объектов таблицы.
Контроллер.
В результате этой команды будут созданы файл контроллера: $HOME/ROR/tickets/app/controllers/users_controller.rb и директория для представлений:
$HOME/ROR/tickets/app/views/users/. Каждому методу котроллера будет соответствовать представление с таким же названием, в этой папке. Их можно создавать вручную, а можно и сразу при создании контроллера:
В этом случае файлы представлений создадутся автоматически в папке $HOME/ROR/tickets/app/views/users/ и будут называться (если вы не забыли подключить haml) index.html.haml и list.html.haml. Удалить контроллер можно так:
где d- сокращение от destroy
Определять метод index, который создаётся по умолчанию, не обязательно. Содержимое нашего контроллера users будет таким:
В users_list будет массив объектов пользователей, которых мы по идее уже понадобавляли из консоли, а "@" означает, что переменная будет передана в шаблон.
Представление.
Теперь создаёи представление, я просто создал этот файл руками в нужной директории:
$HOME/ROR/tickets/app/views/users/list.html.haml
Документацию по HAML можно почитать здесь (http://haml.info/tutorial.html), а пока набо понадобится минимум знаний о нём, например то, что вместо открывающего и закрывающего тега в нём используется "%tag". То есть после рендеринга шаблона, содержащего %html, мы получим страницу с . Уровень вложенности задаётся табуляцией, атрибуты тегов пишутся «хешеобразно» в фигурных скобках: превратится в , а содержимое — через пробел: %td test. Таким образом содержимое нашего представления:
Дефис — исполняемый код в шаблоне. Здесь мы проходимся по массиву объектов и выводим в цикле его методы — поля name и role и id.
Все представления «оборачиваются» в главный шаблон, который находится в $HOME/ROR/tickets/app/views/layouts/application.html.haml
Удаляем всё, что в нём есть и делаем его максимально простым:
Содержимое всех наших сгенерированных шаблонов подставляется вместо =yield. Главное не ошибится с уровнями вложенности, меня это поначалу очень напрягало).
Развертывание веб-приложения PHP включает в себя либо загрузку файлов на сервер через FTP, либо фиксацию и отправку в главную ветку репозитория Git . В этом нет ничего сложного. Развертывание приложения Rails легко в соответствии с официальной документацией Rails. Как бы я ни любил официальные документы, они неправильно поняли эту часть. Развертывание приложения Rails может быть огромной головной болью, не в последнюю очередь потому, что вариантов так много.
В конце концов, это сводится к двум вещам: вы можете либо развернуться в облачной службе, где за большинством сложных вещей заботятся о вас, либо для большего контроля вы можете развернуть на виртуальном частном сервере (VPS). Мы рассмотрим оба варианта в этой серии.
Развертывание в облаке
Мы выберем Heroku в качестве нашего облачного варианта, поскольку он очень популярен для развертывания приложений Rack и Rails. Вы развертываете в Heroku, отправляя изменения в пульт Git, которые Heroku предоставляет вам при первом создании приложения в их службе.
Это должно показаться знакомым для PHP-кодеров, переходящих на ruby, особенно если вы использовали облачную платформу, например, phpfog .
Чтобы запустить приложение Rails на Heroku, необходимо выполнить несколько шагов:
- Разработайте свое приложение (дох!)
- Зарегистрируйтесь в Heroku, если вы еще этого не сделали
- Инициализировать Git для вашего проекта
- Создать приложение Heroku
- Добавьте пульт Git для Heroku (например, у вас может быть удаленное хранилище Github)
- Вставьте ваше приложение в Heroku
- Перенос базы данных (если вы ее используете)
Выбор базы данных
Heroku не поддерживает Sqlite, поэтому, если ваше приложение использует его, Heroku будет жаловаться. Heroku использует отличный Postgresql . Во время первоначального развертывания вашего приложения вы можете запустить миграцию, чтобы заполнить базу данных Heroku Postgresql. Если вы перешли на разработку с использованием Rails из PHP, вы привыкнете к MySQL. В этом случае вам нечего бояться Postgresql. В последнее время он приобрел популярность среди разработчиков Rails, поэтому к нему стоит привыкнуть.
Если вы все еще рассматриваете возможность использования Sqlite, эта статья о центре разработки Heroku должна помочь вам в этом.
Изменение имени приложения
Предполагая, что вы хотите, чтобы это приложение имело реальную цель, а не только для тестирования, вы захотите использовать для него разумное имя. Вернемся к командной строке:
Приятно то, что ваш пульт Git будет автоматически обновляться. Если вы используете веб-сайт Heroku для переименования своего приложения, вам необходимо удалить старый пульт Heroku и добавить новый:
Если у вас есть доменное имя, которое вы хотите использовать для своего приложения, вернитесь в командную строку и выполните:
Далее мы развернем.
Развертывание приложения
Все, что вам нужно сделать, это:
База данных
Вы также можете развернуть свои миграции. Вернемся к командной строке:
Вы можете увидеть предупреждение об устаревании плагинов вендора / плагинов. Вы можете спокойно игнорировать предупреждение, если знаете, что ничего не сделали с плагинами.
Развертывание на виртуальном частном сервере (VPS)
Когда вы регистрируетесь в Linode, вы можете выбрать (Linux) серверную операционную систему. У них есть Ubuntu, Fedora, OpenSUSE и т. Д., Поэтому ваш любимый, вероятно, будет поддерживаться. Также возможно создать и разрушить, если вы ошибетесь. На самом деле, это поощряется на Линоде. Так что, если вы Linux n00b, есть много помощи и поддержки.
Когда ваш сервер настроен, это необработанная базовая установка сервера. Это означает, что для запуска и запуска Rails-приложения вам сначала потребуется выполнить некоторую установку. О, и если вам интересно, нет, нет графического интерфейса. Это командная строка полностью.
Стек производства
У вас есть варианты здесь. В итоге я выбрал Nginx для веб-сервера, PostgreSQL для базы данных и rbenv для управления версиями Ruby. Вы также можете легко выбрать Apache , Phusion Passenger и MySQL . Я сделал этот выбор, потому что уже работал с Phusion Passenger и RVM и хотел попробовать другие варианты.
После настройки Linode войдите в систему через SSH. Ваша панель управления Linode содержит всю информацию, необходимую для этого:
Вы должны запустить обновление дистрибутива и установить все, что требуется в первую очередь. Затем установите компоненты производственного стека. Если вы используете Ubuntu, установите опцию свойств программного обеспечения, чтобы упростить добавление новых репозиториев в apt:
В этой статье я расскажу как проще и удобнее всего разворачивать приложения на ruby on rails на нашем хостинге. Используя эту инструкцию вы сэкономите время и легко обнаружите ошибки, которые могут возникать при развертывании Rails-приложений. Так же будет информация о самых частых проблемах и о том, как их избежать. Описанный метод так же подходит и для Rack-приложений, с некоторыми оговорками и незначительными изменениями в конфигурационных файлах.
Сервер приложений.
Определяем нужную версию Rails.
Если наше приложение использует rails 3.X, первым делом следует войти по ssh на сервер и установить соответствующий gem. Для этого нужно выполнить команду:
Дело в том, что unicorn при старте запускается вне bundle, поэтому он будет использовать rack 1.1, и не сможет запустить приложение, требующее более новую версию rack, так же как и не сможет заменить в процесс работы уже активированную версию rack на более новую. Это является особенностью работы rack и часто приводит к ошибкам, если не помнить о ней.
Создание проекта из панели управления.
Размещение кода на сервере.
Вам нужно разместить код вашего приложения в директории внутри releases, имя выберите произвольно, а затем изменить ссылку current, чтобы она указывала на директорию с вашим приложением, вместо initial_release, сделать это можно командой ln -sf по ssh.
Распространенные ошибки, где их искать и как избежать.
Что делать, если после перезагрузки кода unicorn на сайте проекта ничего не поменялось? Это значит, что новый экземпляр unicorn не смог запуститься по какой-то причине. Для выяснения причины нужно посмотреть последние строки файла log/unicorn.stderr.log в той директории, где запущена версия unicorn, которая осталась работать. При загрузке нового приложения это будет releases/initial_release.
Еще одна частая ошибка, это попытка зайти на домен, созданный для проекта сразу после появления его в панели управления. Дело в том, что для перезагрузки конфигурации DNS-сервера требуется некоторое время, потому лучше подождать несколько минут. В противном случае можно оказаться в неприятной ситуации. DNS сервер вашего провайдера может кэшировать ответы на запросы, если вы зайдете слишком рано и получите ответ, что такого домена нет, и это попадет в кэш, может получиться, что после того, как наш DNS сервер уже начнет сообщать IP-адрес этого домена, вы все еще будете получать ошибочный ответ из кэша.
В этой статье я хочу рассказать, как создать простое приложение, работающее с базой данных MySQL в среде Ruby on Rails 3. Можно рассматривать этот материал, как пошаговое руководство для начинающих программистов Rails.
Итак, для работы нам необходима установленные рельсы и rubygems. С последними у меня вчера была проблема, поэтому пришлось удалить пакет rubygems1.8 не понятно как оказавшийся в системе и поставить rubygems1.9 Напомню, что разрабатываю я на Ubuntu, хотя для Windows команды консоли Rails думаю будут теми же. В качестве среды разработки использую NetBeans с плагином для Ruby on Rails. Про установку неплохо написано в этой статье моего коллеги.
Проверка ссылок
Необходимо убедиться, что каталог /usr/bin содержит символические ссылки rails, rake, ruby, bundler на файлы из каталога /usr/local/ruby/bin. Дл просмотра ссылок используйте команду:
в зависимости от того, что хотите отфильтровать.
Создаем приложение
Я создал специальный каталог для своих ruby-приложений.
У рельсов есть много консольных утилит, которые сильно облегчают работу, в особенности по прототипированию. Для создания приложения, использующего в качестве базы mysql выполним команду:
После этого, в консоли будет что-то вроде этого:
/ruby/app> sudo bundle install
Using rake (0.8.7)
Using abstract (1.0.0)
Using activesupport (3.0.0)
Using builder (2.1.2)
Using i18n (0.4.2)
Using activemodel (3.0.0)
Using erubis (2.6.6)
Using rack (1.2.1)
Using rack-mount (0.6.13)
Using rack-test (0.5.6)
Using tzinfo (0.3.23)
Using actionpack (3.0.0)
Using mime-types (1.16)
Using polyglot (0.3.1)
Using treetop (1.4.8)
Using mail (2.2.9)
Using actionmailer (3.0.0)
Using arel (1.0.1)
Using activerecord (3.0.0)
Using activeresource (3.0.0)
Using bundler (1.0.3)
Using mysql2 (0.2.6)
Using thor (0.14.4)
Using railties (3.0.0)
Using rails (3.0.0)
Your bundle is complete! Use `bundle show [gemname]` to see where a bundled gem is installed.
Это значит, что все гемы установлены и подключены. Если чего-то не хватает, то bundle сам скачает их с rubygems и установит. Вот этого мне долгое время не хватало в php, по сути получается установщик проекта. Список зависимых гемов находится в файле Gemfile в корне проекта.
Конфигурирование
Пароль пишем в кавычках. Дальше необходимо создать модель данных, например создадим модель пользователя. Делаем это из консоли в папке проекта:
rails generate model User name:string hashed_password:string salt:string
Сразу видно, чего нагенерил нам Rails:
invoke active_record
create db/migrate/20101107054200_create_users.rb
create app/models/user.rb
invoke test_unit
create test/unit/user_test.rb
create test/fixtures/users.yml
Отлично, теперь нам надо создать базу данных. Выполняем для этого:
/ruby/app$ rake db:create
(in /home/andrey/ruby/app)
andrey@vaio:
Консоль выводит добавленные данные. Смотрим в phpmyadmin и видим новые базы app_development и app_test, а также таблицы в них. Теперь настала очередь добавить реальные данные. Для этого запускаем консоль rails
Посмотрим в базу, и действительно у нас появились два пользователя. Хочется отметить, что Rails сам добавил столбцы первичного ключа и поля created_at (дата создания) и updated_at (дата изменения) модели.
Модель у нас есть, данные тоже. Пора запустить наше приложение.
Обновляем страничку в броузере, и видим, что теперь отображается наш вид.
Find me in app/views/index/index.html.erb
Отлично. Теперь можно кодить 🙂 Заходим в наш вновь созданный контроллер (Controllers -> index_controller.rb) и пишем там такой текст действия:
class IndexController < ApplicationController
def index
@users = User.find(:all)
end
end
Тепеь открываем вид Views/index/index.html.erb и пишем там такой код:
Этим, мы говорим Rails пройтись по массиву пользователей и отобразить их имена. Обновляем страничку и видим список пользователей внизу.
Find me in app/views/index/index.html.erb
andrey
vasiliy
Отлично! Приложение создано!
Спасибо!
Если вам помогла статья, или вы хотите поддержать мои исследования и блог - вот лучший способ сделать это:
Дружище, ты написал нереально втыкаемый пост.
Эм, так он всё-таки втыкаемый или не втыкаемый?)
UPD: Судя по Like в баззе всё-таки втыкаемый 🙂
Втыкаемый, спасибо. Уже ищу что-нибудь про scaffold.
а как мультисайтовость в руби или refinary CMS сделать? Или такое невозможно?
Читайте также: