2015-02-06 33 views
0

我有一个删除功能的问题。我做了以下内容:删除功能无法正常工作

设置路线:

resources :todos do 
member do 
    delete :destroy_all 
end 
end 

建立一个链接index.html.erb

<%= link_to "Delete last seven days", destroy_all_todo_path(@todos), class: 'btn btn-success', method: :delete %> 

而且在我的控制器定义了以下方法:

def destroy_all 
@todo = Todo.where("created_at <= ?", Time.now - 7.days).destroy_all 
if @todo.destroy 
flash[:notice] = "Your old todos are deled!" 
else 
flash[:error] = "There was an error!" 
end 

但是,当我尝试运行它时,我得到了错误:未定义的方法`销毁'为[]:Array

关于这里出了什么问题的任何想法?

+0

试着想象在你已经运行'destroy_all'之后'if @ todo.destroy'的行为。 '@ todo'有什么价值?我认为应该清楚的是,这里的'if'陈述没有意义。 – ptd 2015-02-06 15:27:49

回答

3

这条线:

@todo = Todo.where("created_at <= ?", Time.now - 7.days).destroy_all 

销毁所有的模型和返回你的已删除记录的数组。然后您在该阵列上拨打destroy

一般情况下,你不需要检查destroy_all是否成功,至少我从来没有一次失败过。只要做到:

def destroy_all 
    Todo.where("created_at <= ?", Time.now - 7.days).destroy_all 
    flash.now[:notice] = "Your old todos are deled!" 
end 

如果你还是喜欢有一个后备,加入救援声明 - 摧毁绝不会回报你假的,它一定会成功或引发异常。

0

正如@ptd在评论中指出的那样,您正在删除对象,然后尝试再次删除它们。我想你的代码改成这样:

def destroy_all 
@todos = Todo.where("created_at <= ?", Time.now - 7.days) 
if @todos.destroy_all 
flash[:notice] = "Your old todos are deled!" 
else 
flash[:error] = "There was an error!" 
end 

尽管此代码将工作,@ BroiSatse的答案是更好,因为检查if声明对一个空数组不会完成任何有用的东西。