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

时间:2011-08-17 10:56:33

标签: ruby-on-rails ruby-on-rails-3 instance-variables

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

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

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

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

我正在使用Ruby 1.8.7和Rails 3。 提前致谢

3 个答案:

答案 0 :(得分:8)

我假设您在登陆页面时想要执行初始化部分,并跳过来自同一页面的所有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

答案 1 :(得分:1)

您应该能够使用之前的过滤器实现此目的:

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

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

答案 2 :(得分:1)

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

  

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

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

# 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调用。