我想向用户展示在他的 PUT/PATCH 请求之后修改了哪些字段
例如,我有一个很大的“项目”表单,有几个字段,但我的用户决定只更新截止日期和项目名称。在他点击“保存”按钮后,我想显示一些消息“您已成功更新:姓名,截止日期”
如果可能的话,我想要一些通用代码来检测更新操作并推断变量名称。泛指,我想在我的 ApplicationController 中实现它,所以我不必在每个控制器#update 操作中添加代码
让我们看一下来自 controllers/entreprise_controller.rb的示例代码
def update
if @entreprise.update_attributes(entreprise_params)
redirect_to @entreprise, notice: "Entreprise éditée"
else
render 'edit'
end
end
这是实现我的目标的步骤的想法。你能帮我解决这些问题吗?或者提出更好的方法?
- 检测我们正在执行一个 CRUD
update
操作,例如从代码中的操作名称,这应该始终是update
(我如何从代码中读取正在执行的操作的名称?) - 猜猜变量名:在这里
@entreprise
,它可以从文件中推断出来(或者可能调用self.class
并做一些正则表达式?) - 保存将要更新的变量列表(可能是一些涉及
before_action
和after_action
和dirty_tracking 的技巧?请参阅我的编辑。) - 将此列表作为 GET 参数提供
redirect to @entreprise
(应该非常简单) - 向用户显示此列表(这部分对我来说没问题)
关于脏跟踪的编辑
Mongoid 已经实现了这一点。然而,主要问题是在保存之前获取中间变量。每个控制器都会像@entreprise
在before_action
回调期间一样实例化变量。如果我before_action
在我的 ApplicationController 中添加一个,它会在之前触发,所以还没有可用的变量。至于after_action
ApplicationController 中的可能,文档说“任何持久性操作都会清除更改。” 所以它已经死了。如果不重写每个控制器,我可能无法逃脱?
简而言之,脏跟踪和控制器:
prepend_before_action
before_action
应用控制器before_action
EntrepriseController(包括 set_entreprise,其中@entreprise
定义了变量以便继续更新)- 如果我们能得到一个回调到 HERE,它将让我们检查对象的脏跟踪信息,因为对象存在于内存中,我们可以使用
@entreprise.attributes=entreprise_params
并查看脏信息(其中 entreprise_params 是 @entreprise 的强参数) - 行动:成功时,它将信息存储在数据库中,我们会丢失脏跟踪信息
after_action