从同一个控制器中的另一个方法调用Ruby on Rails控制器方法会跳过before_filter?

时间:2015-10-12 14:40:35

标签: ruby-on-rails

在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不会执行,如何在不重写所有内容的情况下更改?

2 个答案:

答案 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

尝试这些方法,看看最适合您的问题。我不能为你做出这个决定,因为代码示例很简单。