ruby-on-rails - 嵌套资源被破坏但关联模型应该防止这种情况(Rails 5 中的验证)
问题描述
我有一个TimeWorked
与has_one
(一或零)关系的班级Event
在我的Event
控制器中作为一个nested_resource 进行操作TimeWorked
,并且适用于创建和更新。
我对我进行了验证,TimeWorked
以便在对象签名(最终)时防止修改(更新或销毁)。
我遵循了所有更新的答案(因为 Rails 5 改变了工作方式chain_halted
)我可以在 SO 上找到。
到目前为止,我可以防止我的主模型TimeWorked
被破坏或更新,但即使使用throw(:abort)
ActiveRecord 仍然会破坏我的关联资源TimeWorkedEvent
。
如何防止此模型及其嵌套资源被破坏?
型号 ( TimeWorked
/ Event
/ Join table
):
class TimeWorked < ApplicationRecord
has_one :time_worked_event, dependent: :destroy
has_one :event, through: :time_worked_event
accepts_nested_attributes_for :time_worked_event, reject_if: proc {|att| att[:event_id].blank?}
# cannot destroy timeworked that has been signed
before_destroy do
not_signed
throw(:abort) if errors.present?
end
def not_signed
errors.add(:signed, "Cannot modify or destroy a signed timeworked") if signed_exist?
end
end
class Event < ApplicationRecord
end
class TimeWorkedEvent < ApplicationRecord
belongs_to :event
belongs_to :time_worked
validates_presence_of :event
validates_presence_of :time_worked
validates_uniqueness_of :time_worked_id
end
控制器:
class TimeWorkedController < ApplicationController
def destroy
@time_worked.destroy
end
end
解决方案
这是因为 before_destroy 在dependent:destroy 回调之后运行。所以你可以在依赖之前做这样的事情来调用它:destroy -
before_destroy :check, prepend: true
def check
not_signed
throw(:abort) if errors.present?
end
推荐阅读
- macos - 使用 Mac Big Sur 安装 upx
- android - 自定义视图未在 BottomSheetDialogFragment 中绘制,有时在无效后调用 onSizeChanged
- c# - 积分系统无法正常工作 Unity(Visual Studio C#)
- c# - Power BI embed API 访问令牌请求通过 Postman 而不是通过代码工作
- linux - 从当前目录中删除所有目录中特定格式的目录/文件
- javascript - 如何在 .addEventListener 中访问 Vue.prototype?
- node.js - linux Azure 函数中的 NodeJS 版本
- angular-cli - 如何解决此问题以安装 Angular Npm?
- reactjs - 为什么我的 css 模块没有覆盖材料 ui 样式?
- powershell - 将字符串添加到位于 FTP 服务器上的现有文本文件