当前位置:  开发笔记 > 后端 > 正文

如何在控制器中的多个操作中存储实例变量?

如何解决《如何在控制器中的多个操作中存储实例变量?》经验,为你挑选了3个好方法。

假设我想在控制器中存储一些变量.我想在一个动作中初始化它,在另一个动作中增加它,然后在另一个动作中读取它.只是声明这个变量@foo不起作用,因为@foo在创建它的动作之后死亡.
我不希望将此变量存储在模型中.

除了将它存储在会话中之外,有没有办法保留这个变量?
好像我已经遇到过这个简单的问题了几次,我想知道解决问题的最佳方法.



1> madlep..:

并不是的.每次调用控制器操作都是无状态的.控制器操作完成后,没有任何内容可用.为每个请求创建一个新的控制器实例,然后在请求结束时将其丢弃.

如果您不希望将其存储在会话或数据库模型中,那么如果您希望该变量特定于特定会话,则没有很多选项.

如果它在所有会话中是全局的,你可以把它放在一个@@class_variable而不是一个@instance_variable,但是一旦你开始有多个Rails进程(每个进程都有它自己的副本),或者如果你在线程安全中运行,这可能会变得混乱模式,你最终可能会遇到令人讨厌的并发错误.

我想你可以看看像memcached这样的东西,但你仍然需要将其键入某个user_id或其他会话标记(除非它是全局的)



2> 小智..:

我也想知道为什么你反对使用会话?如果您不喜欢直接在您的操作中使用会话,则可以@foo使用过滤器模拟幸存的实例变量.这样的事可能吗?

class FooController < ApplicationController
  before_filter :load_foo
  after_filter :save_foo

  private
    def load_foo
      @foo = session[:foo] || 0
    end

    def save_foo
      session[:foo] = @foo
    end

end

您的操作将能够通过@count实例变量操纵值,并且这将自动持久保存到会话.



3> paulthenerd..:

您可以使用内置的Rails.cache机制来存储值,但正如第一个答案中所提到的,您必须将其键入user_id之类的内容.这是一个很好的方法,因为您可以使用不同的存储机制支持它.

Rails.cache.write(:foo)
# in later action
Rails.cache.read(:foo)

你可以看到的另一件事是flash hash,它提供了一个keep方法,使flash值持续多个后续请求.

因此,在操作1中,您可以创建值:

flash[:foo] = some_value
flash.keep(:foo)

在操作2中,您可以访问它,如果您希望它保持活动状态以进行更多后续操作,请再次调用keep.

flash[:foo] #use it for something
flash.keep(:foo) # keep it for another request

在http请求的上下文中干净地做这件事有点棘手.

推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有