【问题标题】:Why might .save fail silently while running a custom rake task?为什么 .save 在运行自定义 rake 任务时会静默失败?
【发布时间】:2015-04-21 13:49:00
【问题描述】:

我正在编写一个 rake 任务,它会更改名为 Update 的模型中的每条记录。由于某种原因,即使save(或save!)返回true,记录也没有保存到数据库中。

我仅使用一条记录 (Update.last) 对其进行测试,以尝试确定问题。所以我使用u = Update.last 记录,修改它,然后使用binding.pry 尝试找出发生了什么。

这是我在pry 中的行为:

pry(main)> Update.last
=> #<Update id: 598, ..., interesting_attribute: "old text">
pry(main)> u
=> #<Update id: 598, ..., interesting_attribute: "new text">
pry(main)> u.save
=> true
pry(main)> u.save!
=> true
pry(main)> Update.last
=> #<Update id: 598, ..., interesting_attribute: "old text">
pry(main)> u
=> #<Update id: 598, ..., interesting_attribute: "new text">

我不明白为什么在save 报告成功后Update.last 没有更新。这是为什么呢?

编辑:

属性本身通过以下方式更改:

u.interesting_attribute.gsub! 'old', 'new'

【问题讨论】:

  • 控制台里没改,数据库里改了吗? Update.find(598) 返回什么?
  • 不,它在数据库中没有改变。 Update.find(598) 返回与 Update.last 相同的内容(即未修改的版本)。
  • 如何更改属性?我认为我们需要查看更多代码。一些before_save 回调可能有问题。
  • 我添加了更改上述属性的行。我在Update 模型中没有任何before_saves。
  • 不要使用gsub!interesting_attribute是一种方法。您只是在更改返回值。尝试分配:u.interesting_attribute = u.interesting_attribute.gsub 'old', 'new'。您在哪里进行此更改,before_save

标签: ruby-on-rails ruby ruby-on-rails-4 gsub rake-task


【解决方案1】:

不要使用像 gsub 这样的 bang 方法!更改 Rails 对象的属性。

interesting_attribute 是一种方法。 gsub! 只是更改返回值,而不是更改属性。尝试分配:

u.interesting_attribute = u.interesting_attribute.gsub 'old', 'new'

(感谢 Satya 的回答,作为评论发布。)

【讨论】:

    猜你喜欢
    • 2020-11-18
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    相关资源
    最近更新 更多