在Rails

时间:2018-07-17 19:37:30

标签: ruby-on-rails ruby

在我的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不应该创建一个新实例,因为它已经被设置。所以我不明白为什么我设置的值在请求时会丢失。

3 个答案:

答案 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