我想在每次用户编辑或创建新配置时将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
答案 0 :(得分:2)
在您的代码中
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并查看错误消息。
这应该为您提供足够的信息来调试您的情况并解决您的错误。
答案 1 :(得分:0)
我发现了问题!它在user_id
中缺少必填字段(ConfigsHistory.create
)并且无法保存该值,但未显示错误(需要找到输出这类错误的方法)。感谢您的时间和建议!