我试图从另一个方法访问方法中的一个变量集。这是在下面的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"
。有人可以告诉我做错了吗?
答案 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_filter
或append_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派生)通常会先执行!