我一直在尝试保存一个实例变量,然后在该实例变量上增加一个值,但是当我重新加载时它总是会重置。
模型看起来像这样
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并且永远不会改变......一直在寻找这个简单问题的解决方案几个小时,请帮忙。
答案 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
按照惯例,您通常会通过索引操作显示现有对象的列表。