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

时间:2016-10-22 16:51:47

标签: ruby-on-rails model controller instance increment

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

模型看起来像这样

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并且永远不会改变......一直在寻找这个简单问题的解决方案几个小时,请帮忙。

1 个答案:

答案 0 :(得分:0)

演示您的代码,应该很清楚为什么它总是2。

我假设您正在导航到IndexController#index(可能通过indices_path)。这会创建一个全新的Waiting对象,初始化为0,在下一行上加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

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