我正在尝试将一个对象添加到我的数组中,但是该数组似乎总是重置,而不是添加。我究竟做错了什么?我认为这与 if(defined? libraryshelf) then
有关,我在这里要做的是找出数组是否存在(如果这是第一次添加或不存在)。 .
def add_book
@listofbooks ||= Array.new
@listofbooks.push(params[:booktitle])
@listofbooks
respond_to do |format|
format.html { redirect_to(:back) }
format.js
end
end
我的 add_book.js.erb 文件
alert('<%= @listofbooks %>');
@listofbooks
只显示我上次添加的书名..
最佳答案
TL;DR: Controller 是无状态的,它们只看到传入的请求。要使列表比当前请求存活得更久,您需要将该列表保存在 session 或数据库中,具体取决于您希望它存活多长时间以及其他考虑因素。
还有一些其他问题...
不要为此使用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 在每个请求上重新创建 Controller 对象,所以下次你需要在会话或数据库中保留任何你想要的东西。
原始帖子通过该方法每次还破坏@listofbooks
来愚弄我们,所以我们认为这真的是一个 ruby 问题。
关于ruby-on-rails - 将对象保存在数组中的问题,Ruby 问题和 Rails 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4835536/