Переменная экземпляра, определенная в методе New, недоступна в методе Create
Я пытался и пытался найти ответ в другом месте, но я просто не могу решить эту проблему.
У меня есть вызов модели BidSignal, который связан с моделью BuySignal. BuySignal имеет много BidSignal, а BidSignal принадлежит BuySignal.
Когда я создаю новый BidSignal, используя новый метод в контроллере BidSignal, я хочу захватить BuySignal, к которому он относится, поэтому я могу сохранить отношение в методе создания BidSignal. В настоящее время я делаю это, передавая buysignal_id контроллеру BidSignal при вызове нового метода. Но когда я прихожу, чтобы создать запись BidSignal и пытаюсь вызвать buysignal_id, чтобы найти запись BuySignal, я получаю сообщение об ошибке - Не удалось найти Buysignal без идентификатора
Bid Signal Новый метод
Def New
@buy_signal_idx = params[:buysignal_id]
@bid_signal = BidSignal.new
конец
Метод создания ставок
Def Create
@a_buysignal = Buysignal.all
@a_buysignal = @a_buysignal.find(@buy_signal_idx)
@a_bid_signal = @a_buysignal.bid_signals.build(bid_signal_params)
if @a_bid_signal.save
flash[:success] = "Bid Signal Successfully Created!"
redirect_to @a_bid_signal
else
render action: 'new'
end
конец
Однако, если я заменю: @a_buysignal = @a_buysignal.find(@buy_signal_idx)
с:
@a_buysignal = @ a_buysignal.find (300)
Все работает нормально (за исключением того, что все мои сигналы ставок связаны с сигналом покупки с идентификатором 300).
Это как если бы @buy_signal_idx не был доступен в методе create. Я попытался абстрагировать это так, чтобы new вызывал класс, чтобы установить переменную для сигнала заявки через свой собственный новый метод, а затем использовал метод get для возврата buy_signal_idx в метод создания сигнала заявки. Но я получаю тот же результат.
Я думаю, что получаю, что если я инициирую переменную экземпляра в методе, эта переменная должна быть доступна другим методам в этом экземпляре объекта - но это не работает.
Я знаю, что я глуп и упускаю что-то фундаментальное - но что это?
1 ответ
Каждый раз, когда поступает новый запрос, rails создает новый экземпляр класса контроллера - следовательно, переменные экземпляра, установленные в предыдущем запросе, больше не доступны (объект контроллера, содержащий эту переменную, уже уничтожен). Это результат отсутствия информации о состоянии в Интернете. Единственный способ сохранить любую форму данных между двумя отдельными запросами - сохранить их в сеансе или отправлять при каждом запросе (на самом деле переменная не хранится, но вы понимаете, о чем я)
Лучший выбор действительно зависит от ваших маршрутов здесь. Если вы используете вложенные ресурсы, чем params[:buysignal_id]
передается как часть url (не строка запроса) и, следовательно, он также доступен в вашем действии create. Так что вы можете просто сделать:
# create action
@a_buysignal = Buysignal.find(params[:buysignal_id])
Если это часть строки запроса, то я бы сделал:
# new action
@buy_signal_idx = session[:byusignal_id] = params[:buysignal_id]
# create action
@a_buysignal = Buysignal.find(session[:buysignal_id])
Другое решение состоит в том, чтобы добавить скрытое поле с params[:buysignal_id]
цените свою форму и используйте ее в своем действии создания, но я думаю, что это немного громоздко.