我的删除功能有问题。我做了以下事情:
设置路线:
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
但是当我尝试运行它时,我得到了erro:undefined方法`destroy'for []:Array
关于这里出了什么问题的任何想法?
答案 0 :(得分: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
如果您仍然希望有一个后备,请添加一个救援声明 - destroy永远不会返回false,它会成功或引发异常。
答案 1 :(得分: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
语句无法实现任何有用的功能。