本文概述
Rails过滤器是在执行控制器的action方法之前或之后运行的方法。当你要确保给定的代码块以调用的任何操作方法运行时, 它们很有用。
Rails支持三种类型的过滤方法:
- 过滤前
- 后过滤器
- 周围过滤器
过滤前
在执行动作控制器中的代码之前, 先执行过滤器之前的Rails。 before过滤器在调用它们的控制器类的顶部定义。要进行设置, 你需要调用before_filter方法。
例:
class UserController < ApplicationController
before_filter :verify_password
def verify_password
...
end
end
在此示例中, 方法verify_password用作before过滤器。在调用任何操作方法之前, 将先调用verify_password方法。
后过滤器
执行动作控制器中的代码后, 执行过滤器后的Rails。就像之前的过滤器一样, 之后的过滤器也定义在调用它们的控制器类的顶部。要设置它, 你需要调用after_filter方法。
例:
class PhotoController < ApplicationController
after_filter :resize_photo
def resize_photo
...
end
end
在此示例中, 方法resize_photo被应用为after过滤器。
周围的过滤器
过滤器周围的轨道包含在执行控制器代码之前和之后执行的代码。通常在需要过滤器之前和之后都需要使用它们。与其他两个过滤器相比, 其实现方式略有不同, 但更为复杂。它通常由一个通用类定义, 该类同时包含before和after方法。
例:
class ActionLogger
def before(controller)
@start_time = Time.new
end
def after(controller)
@end_time = Time.now
@elapsed_time = @end_time.to_f - @start_time.to_f
@action = controller.action_name
# next save this logging detail to a file or database
table
end
end
在ActionLogger类中, 在方法捕获时间之前, 一个动作开始, 在方法捕获时间之后, 一个动作完成。
让我们看看ActionLogger类如何作为环绕过滤器。在你的控制器类中, 只需添加around_filter方法并将ActionLogger的实例作为参数传递。
class PhotoController < ApplicationController
around_filter ActionLogger.new
end
保护过滤器方法
控制器类中的任何方法都可以从浏览器进行路由。它是通过保护类中方法的能力来完成的。所有Ruby方法都具有以下保护级别之一。
- 公共:可从任何外部类或使用与定义它们相同类的方法访问这些方法。
- 受保护的:这些方法只能在定义它们的类中以及从定义它们的类继承的类中访问。
- 私有:这些方法只能在定义它们的类中访问。
默认情况下, 方法始终是公共的。表示任何外部类或方法都可以访问它们。要定义保护级别, 你可以通过在要保护的方法之前放置protected或private关键字来声明方法。
注意:受保护的方法和私有方法无法从浏览器路由。
范例:
class User
def new_user
...
end
protected
def sign_in
...
end
private
def user_identity
...
end
def assign_sidekick
...
end
end
在上面的示例中, 有一个受保护的方法和两个私有的方法。在User类中, 将user_identity方法设为私有方法。只有User类中的其他方法可以调用它。 sign_in方法只能由User类或从User类继承的类中的方法调用。