Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails 4:self.update在模型内部不工作_Ruby On Rails_Ruby_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails Rails 4:self.update在模型内部不工作

Ruby on rails Rails 4:self.update在模型内部不工作,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,我试图建立一个简单的软删除系统,方法是在destroy之前添加一个回调,该回调设置deleted标志,然后返回false(以防止真正的destroy发生) class项目

我试图建立一个简单的软删除系统,方法是在destroy之前添加一个
回调,该回调设置deleted标志,然后返回false(以防止真正的destroy发生)

class项目
这不会导致记录得到更新。我不知道为什么。我在日志中看到了
[1m[36m(0.4ms)[0m[1m回滚[0m
,但我不确定它是否相关。

如果before_*回调返回false,则所有后面的回调和 关联的操作被取消。如果after_*回调返回false, 所有后面的回调都被取消。回调通常在 它们被定义的顺序,除了定义为 模型上的方法,这些方法最后调用

如果before_*回调返回false,则所有后面的回调和 关联的操作被取消。如果after_*回调返回false, 所有后面的回调都被取消。回调通常在 它们被定义的顺序,除了定义为 模型上的方法,这些方法最后调用


我想,
self.update\u columns(is\u deleted:true)
可能有效…

我想,
self.update\u columns(is\u deleted:true)
可能有效…

我建议直接在控制器中重写destroy方法。一如既往,尝试遵循rails的最佳实践“胖型瘦控制器”.我会在模型中创建大部分逻辑,然后简单地从控制器调用它,如下所示:

在您的模型中:

def soft_delete!
    update_attribute(:is_deleted, 1)
    #remove any other attributes you want here (ie. if there are tasks associated with projects and such they should also be cascade "soft deleted here"
end 
在控制器中:

def destroy
   @project = Project.find(params[:id])
   @project.soft_delete!
   redirect_to projects_path
end
类似的方法会奏效-除此之外,您可能希望:

  • 使soft_delete返回布尔值,以便您可以在控制器中打开它并重定向到其他位置
  • 软删除其他模型中的其他相关属性(我在其中添加了注释)

我建议直接在控制器中重写destroy方法。一如既往,尝试遵循rails“胖模型瘦控制器”的最佳实践。我将在模型中创建大部分逻辑,然后从控制器中简单地调用它,如下所示:

在您的模型中:

def soft_delete!
    update_attribute(:is_deleted, 1)
    #remove any other attributes you want here (ie. if there are tasks associated with projects and such they should also be cascade "soft deleted here"
end 
在控制器中:

def destroy
   @project = Project.find(params[:id])
   @project.soft_delete!
   redirect_to projects_path
end
类似的方法会奏效-除此之外,您可能希望:

  • 使soft_delete返回布尔值,以便您可以在控制器中打开它并重定向到其他位置
  • 软删除其他模型中的其他相关属性(我在其中添加了注释)
试试看
self.update\u属性(已删除:1)

在Rails 4.2.4上为我工作
self.update\u属性(已删除:1)


在Rails 4.2.4上为我工作过,所以我的策略不起作用,因为返回
false
会撤消设置标志的更新。是吗?是的,它不会继续。我想你应该将逻辑移到你的控制器上。或者可能会搜索覆盖模型的destroy方法是否有什么好办法。所以我的策略egy将不起作用,因为返回
false
会撤消设置标志的更新。是吗?是的,它不会继续。我想你应该将逻辑移到你的控制器上。或者可能会搜索覆盖模型的销毁方法是否有什么好处。从本质上说,我不认为使用before\u destroy是最好的实现方法基本上,我不认为使用“销毁前”是实现你想要的东西的最佳方式:)。