рельсы разные параметры form_for для разных задач?

У меня есть следующие два form_for(), которые меня смущают.

# form for users
form_for(@user) do |f|

# form for sessions
form_for(:sessions, url: login_path) do |f|

Я понимаю, что первый - просто пройтись по всем пользователям и ввести форму. Я не уверен, почему при создании нового сеанса параметры для form_for перечислены как таковые. Почему существует путь входа?

Майкл Хартл объяснил это так: «в случае сеансов нам нужно указать имя ресурса и соответствующий URL-адрес», но мне это ничего не объясняет.

любое просветление было бы хорошо!


person user3277633    schedule 22.10.2014    source источник


Ответы (2)


Передача метода :url в form_for необязательна при работе с объектом модели. при использовании его для создания нового объекта:

# long-style:
form_for(@user, url: users_path)
# same thing, short-style (record identification gets used)
form_for(@user)

В укороченной версии используется концепция под названием Идентификация записи, в основном rails определяет, является ли запись новой, спрашивая record.new_record?. Он также выбирает правильный путь для отправки на основе класса объекта, в данном случае @user.class

Тот же принцип применяется при использовании form_for при обновлении существующего объекта. В этом случае record.new_record? возвращает false, и rails понимает, что форма должна быть передана действию update контроллера.

В тех случаях, когда путь, по которому должна быть отправлена ​​форма, не может быть определен rails с использованием вышеуказанного механизма, URL-адрес должен быть указан явно. Это также применимо при определении Единичных ресурсов, таких как resource :geocoder. при создании форм для сингулярных маршрутов необходимо указывать URL:

form_for @geocoder, url: geocoder_path do |f| 
person Alireza    schedule 22.10.2014

В первом случае помощник form_for проверяет переменную @user, чтобы увидеть ее состояние. Пользователь может быть новой записью (в этом случае форма указывает на /users с POST*) или существующей записью (users/:id с PATCH). Он также может предоставлять предварительно заполненные входные данные на основе состояния переменной.

Вторая форма используется, когда нет необходимости в экземпляре модели (или, может быть, модель даже не существует), а помощник form_for используется только для удобства. Параметр url задан явно, потому что по умолчанию действие будет указывать на текущий URL-адрес, а вы хотите, чтобы он указывал на login_path.

*Технически они оба являются POST на стороне браузера, позже Rails различит их.

person Jiří Pospíšil    schedule 22.10.2014