Rails - 在PATCH后显示更改

时间:2015-07-04 20:22:14

标签: ruby-on-rails controller mongoid user-feedback

我想向用户显示在PUT / PATCH请求后修改了哪些字段

例如,我有一个很大的“项目”表单,有几个字段,但我的用户决定只更新截止日期和项目名称。点击“保存”按钮后,我想显示一条消息“您已成功更新:名称,截止日期”

如果可能,我想要一些检测更新操作并推断变量名称的通用代码。通用我的意思是,我想在我的ApplicationController中实现它,所以我不必在每个控制器中添加代码#update action

让我们看一下 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_actionafter_action以及dirty_tracking的一些技巧?请参阅我的编辑。)
  • 将此列表作为redirect to @entreprise的GET参数提供(应该非常简单)
  • 向用户显示此列表(这部分对我来说没问题)
关于脏跟踪的

编辑

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

Dirty Tracking&控制器简而言之:

  1. prepend_before_action

  2. ApplicationController的before_action

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

0 个答案:

没有答案