【问题标题】:Update a column to zero from a controller从控制器将列更新为零
【发布时间】:2021-05-30 20:39:07
【问题描述】:

由于某种奇怪的原因,new_messages_count 列在数据库中没有更新为零。我正在从控制器执行此操作:

 @conversation = Conversation.find(params[:id])
 @conversation.update(new_messages_count: 0)

列设置如下:t.integer :new_messages_count, default: 0, null: false

如果我在 rails 控制台内执行上述操作,则该列将更新为零。我不知道为什么会这样,但有人可以告诉我如何从控制器将列更新为零吗?

【问题讨论】:

  • 您是否将控制器文件中的字段列入白名单?
  • 在您提交请求时也添加您的日志
  • 您可以随时使用调试器查看@conversation 是否由于任何验证检查而失败。如果您看到 Commit 消息或 Rollback 发生,请检查日志。
  • 感谢@ManojMenon 的回复。我不认为我必须将控制器内的列列入白名单......因为我在 show 方法中有上述代码。因此,当我访问该显示页面时,new_messages_count 列需要更新为零。这没有发生!同样,现在我正在仔细检查控制台,更新操作根本没有出现。
  • Conversation Update (0.8ms) UPDATE "conversations" SET "updated_at" = $1 WHERE "conversations"."id" = $2 [["updated_at", "2021-03-01 10:34:42.686009"], ["id", 3]] ↳ app/controllers/messages_controller.rb:11:in chat_room'` (0.4ms)

标签: ruby-on-rails


【解决方案1】:

您可能有一些验证问题

即使您的实例无效,您也可以将 update 替换为 update_columns 以更新您的列。 (或确保您的实例有效)

【讨论】:

  • 感谢@fabster 的回复,我收到此错误new_messages_count is marked as readonly
  • @Dev 哦,您的实例是只读的。我不确定这是从哪里来的,但解决方案可能是:``` conversation = Conversation.find(params[:id]) conversation.instance_variable_set(@readonly, false) conversation.update(new_messages_count: 0) `` `
  • 立即获取:nil is not a symbol nor a string
  • 啊,忘记我的最后一个答案然后也许尝试在你的模型对话中添加这个。rb def readonly? false end
  • @Dev 但话又说回来,我不确定为什么您的实例首先处于只读状态。如果它不起作用,我希望其他人来告诉我们原因!
【解决方案2】:

验证可以阻止此更新 您可以通过update_columns查看

 @conversation = Conversation.find(params[:id])
 @conversation.update_columns(new_messages_count: 0)

【讨论】:

猜你喜欢
  • 2016-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-07
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多