如何将Ruby“instance_eval”调用提取到方法中?

时间:2016-11-01 22:51:20

标签: ruby

我有一个用于Padrino应用程序的Ruby代码:

module Filters
  def self.authorize_admin
    proc { halt(401) unless current_user.admin? }
  end
end

App.controllers :secrets do
  before :show, &Filters.authorize_admin
  # ...
end

secrets控制器收到show路由上的请求时,它将运行authorize_admin过滤器。

如果我希望此规则适用于每条路线,我可以写一下:

before { instance_eval &Filters.authorize_admin }

我想将其提取到Filters中的方法,以便我可以写:

before { Filters.only_administrators }

这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

我这样做了:

module Filters
  def self.authorize_admin
    proc { halt(401) unless current_user.admin? }
  end

  def self.filter(controller, filter)
    filter_method = method(filter.to_sym)
    controller.instance_eval &(filter_method.call)
  end
end

现在你调用它:

Filters.filter(self, :authorize_admin)