на Rails, как form_for и validate_presence_of работают рука об руку? - PullRequest
2 голосов
/ 26 мая 2009

когда у нас есть validate_presence_of: name в модели, а затем, когда мы добавляем действие создания, которое мы повторно визуализируем 'new', тогда form_for заполнит поля, а error_messages_for 'story' будет иметь правильное сообщение об ошибке.

это действительно здорово, и в то же время это похоже на магию ... я обнаружил, что многие книги не объясняют, как происходит магия. это какой-то глобальной переменной?

когда вызывается form_for ... использует ли он @story, возвращенную из @ story.save, вместо @story = Story.new из нового действия? так что если я использую: story для form_for, поля не будут заполнены при ошибке?

иногда я чувствую, что играю в магию при использовании Ruby on Rails, за исключением того, что я не знаю, как происходит волшебство ... вроде как, если я заставлю кролика появиться, но я не знаю, как я это сделал , Поэтому я действительно хочу знать внутреннюю работу Rails.

1 Ответ

6 голосов
/ 26 мая 2009

Да, Rails очень волшебен. К сожалению, это то, чему вы должны научиться жить, и как только вы привыкнете к соглашениям, вы сможете использовать магию, чтобы с легкостью делать некоторые очень сложные вещи.

Здесь есть три отдельных вопроса, которые относительно просты по отдельности, но выглядят очень волшебно, когда вы принимаете все это сразу. Давайте разберем их по очереди:

При сбое проверки они запрещают сохранение объекта модели и добавляют ошибки в хэш object.errors.

Когда вы запускаете @ story.save, он запускает все проверки. Поскольку @ story.name пустое, validates_presence_of: name добавляет ошибку к объекту.

Переменные экземпляра в контроллере доступны для представлений, которые они отображают.

Итак, да, это та же самая история @, к которой у представления есть доступ - к недействительной и к ней прикреплена информация об ошибках.

form_for принимает много форм, и та, которую вы используете, очень умная

Тег form_for в вашем представлении, вероятно, выглядит следующим образом:

<%= form_for @story do |story| =>

Это специальная версия form_for, которая выводит все виды информации из переданного объекта и соответствующим образом отображает форму. @story заполняет некоторые поля из-за строки

@story = params[:story]

в вашем контроллере, так что он идет вперед и заполняет эти поля для вас. Он также делает некоторые другие вещи - например, проверяет @ story.new_record? чтобы узнать, следует ли использовать метод HTTP POST (RESTful create) или метод PUT (обновление RESTful).

В итоге, есть много маленьких кусочков магии, которые нужно выучить, но как только вы сделаете большую магию, ее будет гораздо легче понять. Удачи!

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