Да, 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).
В итоге, есть много маленьких кусочков магии, которые нужно выучить, но как только вы сделаете большую магию, ее будет гораздо легче понять. Удачи!