模型不保存Rails中的历史模型的值

时间:2017-01-18 18:40:37

标签: ruby-on-rails

我想在每次用户编辑或创建新配置时将configs_histories表中的所有值保存到历史记录表(configs)。因此,我使用after_save模型中的回调Config来调用save_configs_map_to_history函数。 但是,当我编辑配置时,rails无法将值保存在历史记录表中,在控制台中显示rollback transaction。我做错了什么?

请提前帮助,谢谢!

config.rb:

class Config < ApplicationRecord  

  after_save :save_configs_map_to_history

  belongs_to :mirth

  has_paper_trail

  def save_configs_map_to_history

    configs = Config.all

    version_no = (ConfigsHistory.maximum('version') || 0) + 1

    configs.each do |config|

      ConfigsHistory.create!(key: config.key, value: config.value,
                             comment: config.comment, mirth_id: config.mirth_id,
                             version: version_no, config_created_at: config.created_at,
                             config_updated_at: config.updated_at, config_created_by: config.created_by,
                             config_updated_by: config.updated_by)

    end

  end

end

我的控制台日志的一部分:

...
(0.0ms)  SELECT MAX("configs_histories"."version") FROM "configs_histories"
    Config Load (1.0ms)  SELECT "configs".* FROM "configs"
    Mirth Load (1.0ms)  SELECT  "mirths".* FROM "mirths" WHERE "mirths"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
    (27.0ms)  rollback transaction
    Rendering configs/_edit.html.erb within layouts/application
...

configs_history.rb:

class ConfigsHistory < ApplicationRecord  

 belongs_to :mirth
 belongs_to :user

end

2 个答案:

答案 0 :(得分:2)

  1. 添加宝石&#39; pry-rails&#39;到你的gemfile并运行bundle
  2. 重新启动服务器
  3. 在您的代码中

    class Config < ApplicationRecord  
    
      after_save :save_configs_map_to_history
    
      belongs_to :mirth
    
      has_paper_trail
    
      def save_configs_map_to_history
    
        configs = Config.all
    
        version_no = (ConfigsHistory.maximum('version') || 0) + 1
    
        configs.each do |config|
    
        binding.pry
          config_history = ConfigsHistory.create!(key: config.key, value: config.value,
                                 comment: config.comment, mirth_id: config.mirth_id,
                                 version: version_no, config_created_at: config.created_at,
                                 config_updated_at: config.updated_at, config_created_by: config.created_by,
                                 config_updated_by: config.updated_by)
    
        end
    
      end
    
    end
    

    当您运行代码时,请检查您的rails控制台,它将停止,您将获得一个控制台来调试问题。

    在该窗口中复制下一行,您将看到它失败。

    之后只需执行config_history.errors并查看错误消息。

    这应该为您提供足够的信息来调试您的情况并解决您的错误。

    要知道如何使用撬检查https://www.youtube.com/watch?v=A494WFSi6HU

答案 1 :(得分:0)

我发现了问题!它在user_id中缺少必填字段(ConfigsHistory.create)并且无法保存该值,但未显示错误(需要找到输出这类错误的方法)。感谢您的时间和建议!