在ApplicationController的子类中使用私有或受保护方法时出错

时间:2010-02-24 15:51:09

标签: ruby-on-rails before-filter

我在一些控制器之间共享一个过滤器,它主要在ApplicationController中声明为私有。此方法设置控制器的查找和分页条件。

class ApplicationController < ActionController::Base
  ...
  protected # or private
    # Define parametros de busca
    def set_find_opts(klass)
      @filter = params[:f].to_i || nil

      @order = klass.set_order params[:o]

      @opts = { :page => params[:page] }
      @opts[:order] = @order if @order
    end
    ...
end

class Admin::UsersController < AdminController
  ...
  before_filter(:only => :index) {|c| c.set_find_opts User }
  ...
end

我收到了这个错误:

  1) Error:
test_should_get_index(Admin::UsersControllerTest):
NoMethodError: protected method `set_find_opts' called for #<Admin::UsersControl
ler:0x848f3ac>
    app/controllers/admin/users_controller.rb:4
    functional/admin/users_controller_test.rb:9:in `test_should_get_index'

为什么会这样?

1 个答案:

答案 0 :(得分:0)

您不能像在块中那样使用显式接收器(object.protected_method)发送私人/受保护的消息。您可以尝试c.send(:set_find_opts, User)c.instance_eval { set_find_opts(User) }