1

我想向用户展示在他的 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

这是实现我的目标的步骤的想法。你能帮我解决这些问题吗?或者提出更好的方法?

  • 检测我们正在执行一个 CRUDupdate操作,例如从代码中的操作名称,这应该始终是update(我如何从代码中读取正在执行的操作的名称?)
  • 猜猜变量名:在这里@entreprise,它可以从文件中推断出来(或者可能调用self.class并做一些正则表达式?)
  • 保存将要更新的变量列表(可能是一些涉及before_actionafter_action和dirty_tracking 的技巧?请参阅我的编辑。)
  • 将此列表作为 GET 参数提供redirect to @entreprise(应该非常简单)
  • 向用户显示此列表(这部分对我来说没问题)

关于脏跟踪的编辑

Mongoid 已经实现了这一点。然而,主要问题是在保存之前获取中间变量。每个控制器都会像@entreprisebefore_action回调期间一样实例化变量。如果我before_action在我的 ApplicationController 中添加一个,它会在之前触发,所以还没有可用的变量。至于after_actionApplicationController 中的可能,文档说“任何持久性操作都会清除更改。” 所以它已经死了。如果不重写每个控制器,我可能无法逃脱?

简而言之,脏跟踪和控制器:

  1. prepend_before_action

  2. before_action应用控制器

  3. before_actionEntrepriseController(包括 set_entreprise,其中@entreprise定义了变量以便继续更新)
  4. 如果我们能得到一个回调到 HERE,它将让我们检查对象的脏跟踪信息,因为对象存在于内存中,我们可以使用@entreprise.attributes=entreprise_params并查看脏信息(其中 entreprise_params 是 @entreprise 的强参数)
  5. 行动:成功时,它将信息存储在数据库中,我们会丢失脏跟踪信息
  6. after_action
4

0 回答 0