在我的Rails应用程序中,我有一个要初始化的类,然后在整个控制器中对其进行访问。因此,想法是如果尚未定义它,则通过应用程序控制器进行设置:
class ApplicationController < ActionController::Base
before_action :set_custom_class
# create an instance of customclass if doesn't exist
def set_custom_class
@custom_class ||= CustomClass.new
end
end
该类的示例:
class CustomClass
def initialize; end
def custom_method
@custom_method
end
def custom_method=(content)
@custom_method = content
end
end
如果我有一个像这样的控制器:
class MyController < ApplicationController
def method_1
# set the custom_method value on my instance
@custom_class.custom_method('Some content')
# return the value I set above
@variable = @custom_class.custom_method
redirect_to :method_2
end
def method_2
# I should be able to retrieve the same value from that same instance
@variable = @custom_class.custom_method
end
end
我发现的是,在调用method_1
时,@variable
会返回我的内容,但是在调用method_2
之后,方法_1(因此,整个应用程序@custom_class的custom_method具有被设置)返回零。
为什么不保留实例? @custom_class
不应该创建一个新实例,因为它已经被设置。所以我不明白为什么我设置的值在请求时会丢失。
答案 0 :(得分:2)
您正在目睹这种行为,因为在两次请求之间未保留控制器的状态。例如,假设current_user
方法为一个请求设置@current_user
,然后为另一个请求返回同一用户。
请考虑使用cookie或数据库在请求之间共享状态的选项。
否则,解决方法是将类变量设置为CustomClass
,但我不建议这样做。
答案 1 :(得分:0)
看起来您的before_action将在每个请求上重新实例化新对象。这意味着,由于您没有将任何内容传递给Method2中的类,因此它将以NULL出现。
答案 2 :(得分:-1)
既然您说的是全应用程序,为什么不将其设置为全应用程序呢?
在config/application.rb
中,
module App
class Application < Rails::Application
def custom_class
@custom_class ||= CustomClass.new
end
end
end
在您的应用程序代码中,
Rails.application.custom_class