TL; DR: Контроллеры не имеют состояния, они просто видят входящий запрос.Для того чтобы список пережил текущий запрос, необходимо сохранить список либо в сеансе, либо в базе данных, в зависимости от того, как долго вы хотите, чтобы он работал, и других соображений.
Существуют и другие проблемы..
Не использовал defined?
для этого, на самом деле, не используйте defined?
ни для чего.Он не имеет много законных применений на уровне приложений.В этом случае libraryshelf
является локальной переменной, и при первой ссылке в методе она не всегда будет определена.
Работайте непосредственно с @listofbooks
и просто отметьте @listofbooks or @listofbooks.nil?
.
Вот несколько рабочих (я думаю) версий ...
def add_book name
@listofbooks = [] unless @listofbooks
@listofbooks << name
end
def add_book name
@listofbooks ||= []
@listofbooks << name
end
def add_book name
@listofbooks = @listofbooks.to_a.push name # yes, works even if @listofbooks.nil?
end
Ага, ваш исправленный пост лучше ... как отмечено в TL; DR: поскольку Rails воссоздает объекты контроллера при каждом запросе,вам нужно будет сохранять все, что вы захотите, в следующий раз в своей сессии или базе данных.
Оригинальный пост обманул нас также забиванием @listofbooks
каждый раз с помощью метода, поэтомуЯ подумал, что это действительно рубиновый вопрос.