将实例变量保存到数据库 Rails

Save instance variable to database Rails

我一直在尝试保存一个实例变量,然后在该实例变量上递增一个值,但它总是在我重新加载时重置。

模型看起来像这样

class Waiting < ApplicationRecord
def increment
    self.number_waiting += 1
    save!
end
def decrement
    self.number_waiting -= 1
    save!
end
def reset
    self.number_waiting = 0
    save!
end
end

控制器看起来像这样

class IndexController < ApplicationController
def index
    @waiting ||= Waiting.new(number_waiting: 0)
    @waiting.increment
    @waiting.save!
end
end

Html 看起来像这样:

<p id="waiting_counter">
        <% @waiting.increment %>
        <%= @waiting.number_waiting %>
        <% @waiting.save! %>
    </p>

出于某种原因,它始终为 2,并且永远不会改变...几个小时以来一直在寻找解决这个简单问题的方法,请帮忙。

遍历您的代码,应该很明显为什么它总是 2。

我假设您正在导航至 IndexController#index(可能通过 indexes_path)。这将创建一个初始化为 0 的全新 Waiting 对象,该对象在下一行上递增 1。然后保存它。

然后(假设 html 来自 index.html.erb)rails 将呈现 html,在此期间 @waiting 对象在显示值之前再次递增现在是 2。然后再次保存该对象。

它的行为完全正常,但我认为真正的问题是您可能对 rails 的工作方式有误解。在控制器上调用索引操作时,调用该操作的结果(默认情况下)是页面 index.html.erb 将在评估嵌入的 ruby 期间呈现。这一切都发生在服务器端,然后将结果 html 发送回客户端。您没有任何客户端可以启动触发增量。

目前还不清楚您在这里实际想要实现什么,以及预期以何种方式调用增量。

在查看您的问题后,我想到您可能希望实例变量在初始化后可用于所有请求。事实并非如此——每个请求都会获得控制器的一个新实例,因此每次重新加载页面时,@instance 最初将为 nil,并会导致创建一个新的 Waiting 对象。您应该做的是从数据库中获取 Waiting 对象,然后递增它,例如:

def index
    @waiting = Waiting.first
    @waiting ||= Waiting.new(number_waiting: 0)
    @waiting.increment
    @waiting.save!
end

顺便说一句,按照惯例,您通常会通过索引操作显示现有对象的列表。