Оразвертывании и первых шагах, CRUD’ах и прочем много написано. На этом останавливаться не хочется. Тем не менее мне кажется для тех кто осваивает Rails (например после Symfony или ZendFramework) нижесказанное будет полезным (т.е. у читателя предполагается некоторое знание MVC фреймворков для PHP/Perl/Python).
Итак. Проект создан, первый контроллер сгенерирован. Что дальше?
Дальше желательно убрать начальную страничку и указать какие controller/action у нас будут за Homepage. Да, нужно копать в сторону роутинга (routing). Описание роутов находится в config/routes.rb. Также просмотреть их можно выполнив rake routes. Изначально роута 2:
/:controller/:action/:id
/:controller/:action/:id(.:format)
Если использовали генерацию CRUD то на каждую подобную операцию добавляется строка в routes.rb и прилично число роутов, которые этому CRUD’у соответствуют.
Ну а нас интересует главная страница, которая определяется таким вот образом:
map.root :controller => ‘index’
Здесь подразумевается :action => ’index’. Если нужен другой, думаю сообразите как его прописать.
Ах, да, и удалите index.html – он больше не понадобится
ОК. Главная страница есть. Шаблон экшена есть. Нужен layout для всей апликации. Пришлось немного покопаться, чтобы выяснить – согласно правилам именования в RoR общий Layout приложения находится в app/views/layouts и называется application. У меня заработал такой вариант:
app/views/layouts/application.rhtml
Если хотите – попробуйте .erb или .html.erb.
Далее возникло желание разместить простую формочку на страничке. В RoR принято пользоваться хэлперами. Хэлперы форм бывают привязанные к модели и не привязанные к модели.
Если через форму создается некий объект модели, то тут все просто и везде очень похоже объясняется. Тут вам и валидация и сообщения об ошибках (такая вот фирменная фишечка видимо)… НО я хотел форму отправки email сделать. Какой там объект БД? А валидацию в едином стиле хочется.
Вот тут придется извратиться. Точнее обратиться к классу ActiveRecord::BaseWithoutTable. Взять его можно здесь gitorious.org/activerecord-basewithouttable-for-rails-2 но придется установить неофициальную сборку GIT (msysgit code.google.com/p/msysgit/ ). После установки (которая кстати выглядела как сборка из исходников) отобразилась консоль, в которую достаточно скопировать
git clone git://gitorious.org/activerecord-basewithouttable-for-rails-2/mainline.git
и класс будет скачан и размещен по месту установки тула (немного придется поискать, но думаю по расширению .rb вы его легко найдете. У меня он, оказался в директории
c:Program Files (x86)msysgitmsysgitgitmainlinelib
Полученную директорию с классом можно скопировать в Libs.
Далее как написано в документации, работаем как описано в документации для форм, связанных с объектом. Точнее почти так же:
- в app/models я вручную создал класс pseudo_contact.rb -> PseudoContact
- в классе указал какие поля каких типов мне нужны и правила валидации (обычным образом):
class PseudoContact < ActiveRecord::BaseWithoutTable
column :name, :string
column :email_address, :string
column :message, :text
validates_presence_of :name, :email_address, :string
end
В этой модели-валидаторе мы просто проверяем заполнение обязательных полей. Остальные валидаторы применяются так же. О них можно погуглить или почитать в спецлитературе.
И после этого можно заняться формой. Но начнем с контроллера. Определим метод, который будет обрабатывать отправленную форму. Предположим что у нас был IndexController и index экшен. Для простоты он и будет использоваться для обработки формы.
class IndexController < ApplicationController
# Index#index
#
def index
@pseudo_contact = PseudoContact.new(params[:pseudo_contact])
@pseudo_contact.save if request.post?
end
end
Здесь сначала создается экземпляр PseudoContact по данным из запроса params[:pseudo_contact]. После этого запись сохраняется, если метод запроса POST. Естественно псевдо-запись не сохраняется, но инициируется валидация.
Форма для данного случая может быть такой: сначала отображаем сообщения об ошибках, если они есть:
<div>
<%= error_messages_for :pseudo_contact %>
</div>
Здесь :pseudo_contact это инстанс, который создается в контроллере
Затем рендерится собственно форма:
<div>
<% form_for :pseudo_contact do |form| %>
<label>Name</label>
<%= form.text_field :name %>
<label>Email</label>
<%= form.text_field :email %>
<label>Message</label>
<%= form.text_area :message %>
<br />
<%= submit_tag %>
<% end %>
</div>
Сообщения об ошибках можно выводить и для отдельного поля. Хочется также отметить что если форма имеет ошибки, то каждое поле с ошибочными данными оборачивается в DIV с классом fieldWithErrors:
<div class="fieldWithErrors">
Поэтому желательно заранее определить для него стиль, например такой:
.fieldWithErrors {
padding: 2px;
background-color: red;
display: table;
}
Вот и все на сегодня.