Я думаю, что вам не хватает концепции, как работает цикл запрос / ответ. В Интернете есть много информации об этом, включая Руководства по Rails, поэтому я буду кратким и упрощенным:
- Ваш браузер отправляет запрос в приложение Rails (запрос GET будет выглядеть как «покажи мне этот URL», а запрос POST будет выглядеть как «сделать это, представленное этим URL, с использованием прикрепленных данных») .
- Ваше приложение получает этот запрос, маршрутизатор Rails находит соответствующий контроллер / действие, а ваше действие выполняет некоторые действия и отображает шаблон, который Rails помогает превратить в ответ.
- Ваш браузер получает этот HTML-ответ и отображает его в браузере.
Вот и все. HTTP не имеет состояния. По умолчанию ваше приложение не сохраняет состояния от запроса к запросу. Вы когда-нибудь видели 50 первых дат? Веб-серверы - это персонаж Дрю Бэрримора, и каждый запрос - это день. Ваше приложение запоминает все, что произошло в этом запросе, но оно начинается с чистого листа при следующем запросе без памяти о последнем. Есть способы обойти это, например, сохранение состояния в файлах cookie, URL-адрес или данные формы, но вы должны сделать это самостоятельно. По умолчанию каждый запрос не имеет связи с последним.
В вашем случае вы имеете дело с двумя запросами. Первый - это GET для вашего index
, второй - POST для вашего create
действия. Каждый запрос приводит к созданию нового экземпляра контроллера со свежим состоянием. Ваше приложение по умолчанию не видит связи между этими двумя запросами. Всегда ли действие create вызывается после индекса? Ваше приложение не известно или не заботится. Это зависит от вас, разработчик.
Я думаю, вы ожидаете, что ваша переменная @flashcard
сохранится между вашим начальным запросом index
и последующим POST до create
. Но представьте, как это будет работать с несколькими пользователями. Два пользователя загружают индекс, затем пользователь A отправляет сообщения create
, за которым следует пользователь B. Как приложение различает их? Как бы он узнал, какую карту каждый просматривал? Ну, это зависит от вас.
Существует несколько способов сохранения состояния между запросами - вы часто будете видеть долговременное состояние, отслеживаемое как часть «сеанса» (cookie), который выходит за рамки ответа - но я Я рекомендую вам прочитать их, так как они очень важны для веб-разработки.
Однако для кратковременного состояния - такого как постоянное состояние между одним запросом -> ответ -> запрос - особенно когда последний запрос является формой POST - вы можете использовать поле формы - и это именно то, как я бы решить вашу проблему.
- Не устанавливайте случайную карточку в вашем действии
create
.
- Добавьте
flashcard_id
скрытое поле к форме, которую вы визуализируете в вашем index
.
- Когда эта форма будет отправлена, ваше действие
create
получит параметр flashcard_id
. Используйте этот идентификатор для создания вашей записи Practice
.
На простом английском это работает следующим образом: ваш пользователь запрашивает страницу со случайной картой (GET index
). Ваше приложение отвечает с помощью некоторого HTML-кода, который будет отображать флэш-карту, а также скрытое поле, содержащее его идентификатор. Пользователь отправляет форму, инициируя новый запрос (POST create
), и идентификатор карточки отправляется обратно на сервер как часть данных формы этого запроса. Ваше приложение получает этот запрос, ожидает, что этот идентификатор будет включен в данные формы (в хэше params
в Rails), и создает Practice
с использованием этого идентификатора.