在Rails 3中初始化变量的位置

我在过去3个月里一直在发现Ruby on Rails,我很着迷。 但有些事我不知道哪种方法最好。 现在我正在堆栈一些变量的初始化。 所有应用程序都在ajax上运行,因此所有实例变量只应初始化一次。

我已经尝试在applicationController中编写一个方法’initialize’,它只运行一次,但问题是我正在访问尚未初始化的请求对象。

我在applicationController中尝试了一个before_filter,但是每次请求都会运行它,即使它是一个ajax请求。

有谁知道如何使用请求对象中的值初始化实例变量? 是的,可能是一个新手问题。

我正在使用Ruby 1.8.7和Rails 3.提前感谢

我假设,当您登陆页面时,您希望执行初始化部分,并跳过来自同一页面的所有ajax请求。

class ApplicationController < ActionController::Base before_filter :load_vars protected def load_vars unless request.xhr? #check if ajax call # do all your initialization here end end end 

如果您正在谈论的变量是从请求参数初始化的,则必须为每个请求初始化该变量。 所以正确的地方应该是过滤前。

我在applicationController中尝试了一个before_filter,但是每次请求都会运行它,即使它是一个ajax请求。

请注意,ajax请求是从服务器端看到的正常请求,因此我不理解您的“偶数”。 如果您正在检查的值来自请求参数,并且您在每个控制器/操作中都需要它,那么您确实在ApplicationController进行了初始化,否则您只能在某个控制器中调用该filter(或者甚至仅对某些操作)句法

 # to execute it only for some actions before_filter :your_initialization_method, :only => [:action1, :action2] # or to exclude some actions before_filter :your_initialization_method, :except => [:action1, :action2] 

如果需要跨不同控制器共享该方法,请在ApplicationController定义它,并仅在相应的控制器中执行before_filter调用。

您应该能够使用之前的filter实现此目的:

 ApplicationController < ActionController::Base before_filter :make_it_rain protected def make_it_rain @rain = 'lots' # You should have access to 'request' in here # Try raise request.inspect for info end end 

如果前filter仅应用于应用程序的一个部分,或者让它针对特定操作运行,则可以将前filter放在特定控制器中。