将对象保存在数组中的问题,Ruby问题和Rails问题

我正在尝试向我的数组添加一个对象,但是数组似乎总是重置,而不是添加。 我究竟做错了什么? 我认为它与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只显示我上次添加的书的标题..

TL; DR:控制器是无状态的,他们只看到传入的请求。 要使列表比当前请求更长,您需要将列表保留在会话或数据库中,具体取决于您希望它存在多长时间以及其他注意事项。

还有一些其他问题……

不用defined? 为此,事实上,不使用defined? 为了任何东西。 它没有很多合法的应用程序级用途。 在这种情况下, libraryshelf是一个局部变量,并且在该方法的第一个引用中始终不会定义它。

直接在@listofbooks@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 

Aha,你的修改后的post更好......正如TL中所述; DR:因为Rails在每个请求上重新创建控制器对象,你需要在会​​话或数据库中保留下次想要的任何内容。

每次通过这种方法,原来的post都会欺骗我们,所以我们认为这真的是一个ruby问题。

因为你在函数libraryshelf永远不会被定义为局部变量。 我猜你正在使用Ruby 1.8.7,所以你在一个范围内创建一个新的数组(你应该看不到)并将其分配给@listofbooks

我建议

 def add_book @listofbooks ||= Array.new @listofbooks.push(name) @listofbooks # return the entire list, not the last thing pushed end 

编辑以反映更新的问题

这是控制器生命周期的问题。 对于每个请求,实例化一个新的控制器对象,以便在请求之间清除任何@variables。 您需要通过session[:booklist] = @booklist类的内容存储变量,然后检索它以获取下一个请求。

查看代码,似乎编写的逻辑与您想要发生的内容的描述不同。 这就是我看到你的代码所说的:

 # Create an Empty Array, assign it to @listofbooks @listofbooks ||= Array.new # Add the name of a book from a request parameter @listofbooks.push("Agile Development with Rails") # At this point @listofbooks only contains 1 element; we started with # an empty array and added 1 element through the request parameter 

但是,听起来您想要执行以下操作:

 def add_book # Simply push the new book title on the array of old books @listofbooks << params[:booktitle] end