在Ruby on Rails中,当我从另一个控制器调用控制器方法时,目标方法(被调用的方法)上的before_filter不会执行。
如何执行此操作?
(要遵循的粗略示例代码)
before_filter :filter_method, :only => [:method_b]
def method_a
if blahblahblah == x
do_something
render j
else
method_b
end
end
def method_b
do_something_else
end
所以这里filter_method不会执行,如何在不重写所有内容的情况下更改?
答案 0 :(得分:0)
我想你错过了在rails中应用before_filter的方法。当您从任何地方调用任何方法时,它都不会被应用。仅在将请求路由映射到相应的控制器方法时才适用。在过滤器作为控制器方法请求之间的保护过程之前,不在其中。 :)
答案 1 :(得分:0)
那是对的。在操作仅在控制器上调用操作时运行,而不是在您自己调用操作时运行。
处理此问题的正确方法取决于您的方法的作用。当前方式仍然从method_b
呈现视图。您最想要的是重定向到该操作,但目前的方式和呈现method_b
都是可能的。
目前的方式(固定):
使用过滤方法调用method_b
并从method_a
呈现视图
def method_a
if blahblahblah == x
do_something
else
filter_method
method_b unless performed? # In case filter_method renders/redirects
end
渲染:
使用过滤方法调用method_b
并从method_b
def method_a
if blahblahblah == x
do_something
else
filter_method
method_b unless performed?
render :method_b unless performed?
end
重定向:
告诉客户端(浏览器)向method_b
发出新请求。这会使用过滤器方法调用method_b
并从method_b
呈现视图。
def method_a
if blahblahblah == x
do_something
else
redirect_to :method_b
end
尝试这些方法,看看最适合您的问题。我不能为你做出这个决定,因为代码示例很简单。