【问题标题】:nested attributes change value before save with cocoon嵌套属性在使用茧保存之前更改值
【发布时间】:2018-02-28 07:21:54
【问题描述】:

我有一个项目模型:

class Project < ApplicationRecord
   has_many  :site_visits, inverse_of: :project, dependent: :destroy

   accepts_nested_attributes_for :site_visits, allow_destroy: true, reject_if: :all_blank

   before_save: :convert_site_visit_dates

   def convert_site_visit_dates
     begin
       if self.site_visits_attributes.present?
         self.site_visits_attributes.each do |site_visit|
            site_visit[1]['visit_date'] = convert_date(site_visit[1]['visit_date']) if site_visit[1]['visit_date'].present?
            site_visit[1]['_destroy'] = true if site_visit[1]['_destroy'] == "1"
         end
       end
     rescue StandardError
       nil
     end
   end 

end

我有 site_visit 模型:(列 - visit_date

class SiteVisit < ApplicationRecord

  belongs_to  :project

end

在通过 cocoon gem 在任何特定项目中保存 site_visits 之前,我需要使用回调更改 site_visits_attributes 的值。在我的项目模型中,您可以看到我定义了一个回调来更改site_visit 表的visit_date 列。但价值没有改变。因此,在数据库中保存空值。

知道有什么问题吗?

【问题讨论】:

  • 您的代码有点混乱:您正在操纵模型中的属性散列?因此,要么您操作属性哈希,并在控制器中执行此操作,要么在模型上添加回调并修复模型。不确定为什么要更改 _destroy 标志?那应该行得通。我所看到的:您正在尝试修复收到的日期格式,这最好在控制器中完成(甚至更好:视图 - 确保日期以正确/预期的格式发送到控制器?)
  • @nathanvda,我在助手中进行了更改。所以,问题解决了。无论如何,谢谢

标签: ruby-on-rails ruby callback nested-attributes cocoon-gem


【解决方案1】:

site_visits_attributes 不是 Project 对象的方法。如果您删除 rescue StandardError,您将发现此问题。

在控制器中修改before_filter 中的数据可能是一个更好的主意。或者,您可以修改 SiteVisit 对象上before_save 上的数据。

【讨论】:

  • 我已经尝试在 SiteVisit 对象中使用before_save。它不工作。我不想在控制器中这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多