Тонкости Ruby-on-Rails для начинающего. Routing. Layout. Form validation.

Оразвертывании и первых шагах, 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">

<input id="pseudo_contact_from_name" type="text" value="" name="pseudo_contact[name]"/>
</div>

Поэтому желательно заранее определить для него стиль, например такой:

.fieldWithErrors {
    padding: 2px;
    background-color: red;
    display: table;
}

Вот и все на сегодня.


This entry was posted in Профессиональное and tagged , . Bookmark the permalink. Post a comment or leave a trackback: Trackback URL.

Post a Comment

Your email is never published nor shared. Required fields are marked *

*
*

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">