【问题标题】:Data in Database not reflected by Rails callsRails 调用未反映数据库中的数据
【发布时间】:2012-11-19 05:57:49
【问题描述】:

这是我遇到过的最奇怪的错误

我在我的 Rails 应用程序中使用 Best In Place gem 以允许就地编辑页面标题。就地编辑工作,新标题在数据库中更改,但是当我刷新页面时,它恢复为旧标题。我什至不明白它从哪里获得旧标题,因为它不再存储在数据库中。

创建页面时,会自动为其赋予标题“无标题页面”。当我将标题更改为“标题”并使用 postgresql 管理程序查看数据库中页面的行时,它确实更改为“标题”。但是当我在 Rails 控制台中运行 Page.find(1).title 时,它​​返回“Untitled Page”

这怎么可能?!

【问题讨论】:

  • 是否存在与未正确关闭的打开事务的池连接?这样它仍然会看到旧数据。在测试时检查pg_stat_activity,看看是否有任何<IDLE> in transaction 条目。还要在psql 中进行测试,以验证数据库中的数据是否确实发生了变化。

标签: ruby-on-rails ruby-on-rails-3 postgresql activerecord best-in-place


【解决方案1】:

您的应用是否在生产模式下运行?

PG 响应和控制台响应不能不同,除非它们在两个不同的数据库上执行。

  1. 检查您的数据库配置是否使用与您在浏览 PG 时手动连接的数据库相同的数据库。

  2. 确保在运行 rails 控制台时指定环境(以防您的默认设置不是您正在运行的环境): $ rails c 生产 $ rails c 开发

  3. 如果以上两种方法都没有帮助,请发布此操作的日志 sn-p。可能是事务正在回滚。如果您使用不带“!”的 .save 或 .update_attribute那么这不会引发错误。但这不太可能,因为您说数据库已更新数据。

【讨论】:

    【解决方案2】:

    修复它。原因是我使用 after_initialize 来设置自动属性,只要 ActiveRecord 对象被初始化,就会调用该属性。我真正想要的是after_create。我使用 after_create 调用一个名为 set_properties 的函数,在其中设置 self.title 之类的内容,然后在函数结束时调用 self.save,这是将属性保存到 DB 所必需的。

    【讨论】:

      猜你喜欢
      • 2015-03-16
      • 2020-12-07
      • 1970-01-01
      • 2017-12-11
      • 2016-09-21
      • 2023-01-04
      • 1970-01-01
      • 1970-01-01
      • 2020-11-17
      相关资源
      最近更新 更多