簡體   English   中英

如何在控制器中的多個操作中存儲實例變量?

[英]How do I store an instance variable across multiple actions in a controller?

假設我想在控制器中存儲一些變量。 我想在一個動作中初始化它,在另一個動作中增加它,然后在另一個動作中讀取它。 只是用@foo聲明這個變量不起作用,因為@foo在創建它的動作后死掉。
我不希望將此變量存儲在模型中。

除了將它存儲在會話中之外,有沒有辦法保留這個變量?
好像我已經遇到過這個簡單的問題了幾次,我想知道解決問題的最佳方法。

並不是的。 每次調用控制器操作都是無狀態的。 控制器操作完成后,沒有任何內容可用。 為每個請求創建一個新的控制器實例,然后在請求結束時將其丟棄。

如果您不希望將其存儲在會話或數據庫模型中,那么如果您希望該變量特定於特定會話,則沒有很多選項。

如果它在所有會話中都是全局的,您可以將它放在@@class_variable而不是@instance_variable ,但是一旦開始有多個Rails進程(每個進程都有自己的副本),或者如果你'在線程安全模式下運行,你最終可能會遇到令人討厭的並發錯誤。

我想你可以看看像memcached這樣的東西,但你仍然需要將其鍵入某個user_id或其他會話標記(除非它是全局的)

我也想知道為什么你反對使用會話? 如果您不喜歡直接在您的操作中使用會話,則可以使用過濾器模擬幸存的@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實例變量操縱值,並且這將自動持久保存到會話。

您可以使用內置的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請求的上下文中干凈地做這件事有點棘手。

如果它是一個簡單的計數或字符串,我認為最好的解決方案是將它存儲在會話中。 這樣,如果您使用多個Web服務器,它就會存在。

你為什么反對使用會話呢?

別擔心,會議不會咬人。

此外,會話可能是最好的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM