Что такое Rails3 эквивалент start_form_tag? - PullRequest
5 голосов
/ 13 октября 2010

Новичок здесь ... Я просто прохожу, что ясно, старое руководство по рельсам.

Для создания формы у них есть следующий код:

<%= start_form_tag(:action => 'create')%>

        <%= text_field(:album, :title) %><br />
        <%= text_field(:album, :artist) %><br />
        <%= text_field(:album, :genre) %><br />
        <%= datetime_select(:album, :release_date) %><br />

        <%= submit_tag("Create") %>

    <%= end_form_tag %> 

Каков правильный синтаксис Rails3 для этого кода?

Спасибо.

Ответы [ 3 ]

21 голосов
/ 13 октября 2010

Со времени 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) С людьми, которых нет.

2 голосов
/ 13 октября 2010

Я настоятельно рекомендую вам использовать два сайта, когда дело доходит до материала RAILS !!!

  1. http://guides.rubyonrails.org/

  2. http://api.rubyonrails.org/

Хорошая новость заключается в том, что ... оба сайта обновлены с помощью Rails 3 !!!

И да, в качестве BBonifield вы можете использовать form_tag

0 голосов
/ 13 октября 2010

Почему бы вам не попробовать Micheal Hartl's Rails Tutorial , это, пожалуй, одно из лучших руководств для начала работы с Rails, RailsCasts.com тоже довольно крутой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...