2009-05-26 1 views
2

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

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

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

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

ответ

6

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

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

Когда валидация не удалась, они запрещают сохранение объекта модели и добавляют ошибки в хэш объекта object.errors.

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

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

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

form_for принимает множество форм, и один вы используете очень умный

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

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

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

@story = params[:story] 

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

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

Смежные вопросы