before_filter看不到另一个before_filter中的值

时间:2014-07-16 10:12:53

标签: ruby-on-rails ruby

我试图从另一个方法访问方法中的一个变量集。这是在下面的Rails 1.9代码中。

class ApplicationController < ActionController::Base
  protect_from_forgery
  before_filter :method1
  before_filter :method2
  def method1
    @remote_user = 'dev_user'
  end
  def method2
    unless @remote_user.present?
      render :status => 401, :text => "Authentication failed"
      false
    end
  end

尝试在第二种方法中访问它时,它总是返回空白。 401始终返回文本"Authentication failed"。有人可以告诉我做错了吗?

2 个答案:

答案 0 :(得分:0)

如果您需要保证在before_filter之前调用另一个方法,请执行以下操作:

before_filter :fn3

def fn3
  fn1
  fn2
end

from - &gt; How can I specify the order that before_filters are executed?

希望有所帮助

<强> EDITED

更好的是,在before_filter方法之前使用prepend_before_filter来解决任何需要解决的问题。

在你的情况下:

    class ApplicationController < ActionController::Base
      protect_from_forgery
      prepend_before_filter :method1
      before_filter :method2
      def method1
        @remote_user = 'dev_user'
      end
      def method2
        unless @remote_user.present?
          render :status => 401, :text => "Authentication failed"
        false
      end
    end

答案 1 :(得分:0)

为了确保before_filter的正确顺序,您可以使用prepend_before_filterappend_before_filter。 Imho prepend是默认行为,因此您的过滤器以相反的顺序执行。

所以要解决这个问题,你必须写:

class ApplicationController < ActionController::Base

  before_filter :method2
  prepend_before_filter :method1

你可以写before_filter两次(按此顺序),这样就可以了,但这更具有表现力。首先写下订单无关紧要的所有before_filters,然后prepend写下需要先订购的那个。

或者你可以写

class ApplicationController < ActionController::Base

  before_filter :method1
  append_before_filter :method2

完全相同,但确保最后执行method2。无论你喜欢什么:)

另请注意,其他控制器中定义的过滤器(从ApplicationController派生)通常会先执行!