ActiveModel::Errors在to_h和to_hash上展示不同的输出是因为它们返回不同的数据类型。to_h返回一个Ruby哈希表,而to_hash返回一个ActiveSupport::HashWithIndifferentAccess对象。
解决方法是使用to_h方法,然后将返回的哈希表转换为ActiveSupport::HashWithIndifferentAccess对象。下面是一个示例代码:
errors = ActiveModel::Errors.new
errors.add(:name, "can't be blank")
errors.add(:email, "is invalid")
# 使用to_h方法获取哈希表
errors_hash = errors.to_h
# 将哈希表转换为ActiveSupport::HashWithIndifferentAccess对象
errors_with_indifferent_access = ActiveSupport::HashWithIndifferentAccess.new(errors_hash)
puts errors_with_indifferent_access.inspect
# 输出: {"name"=>["can't be blank"], "email"=>["is invalid"]}
这样,我们就可以在使用to_h方法获取哈希表后,将其转换为ActiveSupport::HashWithIndifferentAccess对象,以获得与to_hash相同的输出。