Со времени Rails 1 многое изменилось, и я действительно впечатлен людьми, которые готовы потратить время, чтобы сесть за Rails 3 и изучить различия (1).Сообщество должно приветствовать их, а RTFM'ы не помогают.Здесь я думаю, что могу помочь.
Я бы написал так в Rails 3:
<%= form_for(@album) do |f| %>
<p>
<%= f.label :title %>
<%= f.text_field :title %>
</p>
<p>
<%= f.label :artist %>
<%= f.text_field :artist %>
</p>
<p>
<%= f.label :genre %>
<%= f.text_field :genre %>
</p>
<p>
<%= f.label :release_date %>
<%= f.datetime_select :release_date %>
</p>
<%= f.submit %>
<% end %>
Вау, так много изменений!С чего мы начнем?Конечно, верхняя строка!
form_for
- это метод, который был в Rails некоторое время и стал чрезвычайно полезным за последние пару основных ревизий.Этот метод возьмет переменную @album
, установленную в контроллере, и проверит ее, чтобы определить пару вещей: 1) куда должна идти форма 2) какими должны быть значения полей.
Я должен упомянутьна этом этапе следует упомянуть, что ваш app/views/albums/new.html.erb
теперь должен выглядеть так:
<h2>New Album</h2>
<%= render "form" %>
OMG, больше нового!Все в порядке: render "form"
отобразит частичное app / views / album / _form.html.erb .Это то место, где должно жить настоящее дурачество form_for
.Зачем?Позвольте мне продолжить объяснение.
В вашем действии AlbumsController
new
у вас будет что-то вроде этого:
def new
@album = Album.new
end
form_for
достаточно умен, чтобы пойти: "эй, это новый ресурс Album
, он, вероятно, хочет перейти к действию create
для этой формы, потому что он хороший парень и следует соглашениям Rails ", так что это именно то, что он будет делать.
Кроме:
Это вызовет исключение, что не определен метод albums_path
.Что за?
В Ruby on Rails 2 маршрутизация RESTful стала Big Thing .Лучше всего, если вы прочитаете руководство по маршрутизации , так как, если бы я объяснил это, я только повторил бы его.В основном: RESTful маршрутизация - это соглашение для маршрутов URL вашего приложения, которое определяет, что когда мы выполняем POST (это форма, помните?) Для / album , это перейдет к действию create
.
Но как Rails узнает, как это сделать?
Потому что в вашем файле config / rout.rb вы поместили эту строку:
resources :albums
Это определяет маршруты к «Семи» действиям вашего контроллера по умолчанию (индексировать, показывать, создавать, редактировать, обновлять и уничтожать).Серьезно, прочитайте руководство по маршрутизации , чтобы узнать все об этой красоте.
Итак, вернемся к нашему маленькому form_for
.Он знает, чтобы перейти к /albums
для нового объекта, который клевый и все.Так что там с аргументом блока f
?Ну, это объект конструктора форм, который позволяет нам создавать элементы формы для конкретного объекта Album
из наших действий new
(и вскоре edit
).Когда мы вызываем:
<%= f.text_field :title %>
Мы делаем Rails 1 эквивалент:
<%= text_field :album, :title %>
Это всего лишь немного синтетического сахара, который Rails дает вам, чтобы сделать ваши взгляды болееСУХОЙ.
Я также добавил ярлыки к вашей форме, потому что пользователям нужно знать, какие поля они заполняют. Прекрасная часть в том, что пользователь не увидит :title
, но увидитTitle
вместо.Для :release_date
они увидят «Дата выпуска».Beautiful.
В конце формы я использую f.submit
.Будет сгенерирована кнопка отправки, в которой будет указано «Создать альбом», если @album
новый объект, или «Обновить альбом», если это уже существующий объект.Но где редактируются уже существующие объекты?
В действии edit
!
def edit
@album = Album.find(params[:id]
end
В вашем app / views / album / edit.html.erb файл, который у вас будет примерно такой же, как у вас в new.html.erb sibling:
<h2>Editing Album</h2>
<%= render "form" %>
Вы можете использовать точно такую же строку , что и воба они отображают один и тот же частичный фрагмент, но он будет работать по-разному, если объект новый или ранее существовал (обычно называемый постоянным).
В случае рендеринга действия edit
в этом случае он сгенерирует маршрут к /albums/1
для формы и сделает запрос Rails-speciality PUT
к этому ресурсу.Еще одна вещь, руководство по маршрутизации очень хорошо объяснит, я надеюсь.
Извините за длину этого ответа, но нет короткого ответа на этот вопрос, это довольно большое изменение, но поверьте мне, когда я говорю это действительно к лучшему.
Рельсы 3 породы.
(1) С людьми, которых нет.