将实例变量保存到数据库 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
顺便说一句,按照惯例,您通常会通过索引操作显示现有对象的列表。
我一直在尝试保存一个实例变量,然后在该实例变量上递增一个值,但它总是在我重新加载时重置。
模型看起来像这样
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
顺便说一句,按照惯例,您通常会通过索引操作显示现有对象的列表。