包装方法会导致方法未定义

时间:2013-11-14 20:01:50

标签: ruby-on-rails ruby authentication

我有一些奇怪的问题:如果我跑

class ApplicationController < ActionController::Base
    http_basic_authenticate_with name: "test", password: "test"

它工作正常。但是,如果我把这个

before_filter authenticate_incoming

  def authenticate_incoming
    http_basic_authenticate_with name: "hi", password: "ho"
  end

我得到undefined method http_basic_authenticate_with。我哪里错了?

2 个答案:

答案 0 :(得分:2)

http_basic_authenticate_with的源代码是

def http_basic_authenticate_with(options = {})
            before_filter(options.except(:name, :password, :realm)) do
              authenticate_or_request_with_http_basic(options[:realm] || "Application") do |name, password|
                name == options[:name] && password == options[:password]
              end
            end
          end

所以你看到它正在实施before_filer。所以你应该做的就是使用类似的东西(你也可以存储一些session登录数据;))

def authenticate_incoming
    authenticate_or_request_with_http_basic do |name, password|
          if name == 'hi' && password == 'ho'
            session[:logged_in] = true
            return true
          else
            return false
          end
        end
end

答案 1 :(得分:0)

http_basic_authenticate_with是一种类方法,authenticate_incoming是一种实例方法。你可以做self.class.http_basic_authenticate_with,但这在before_filter中没有多大意义。你的目标是什么?也许我可以帮助你思考如何完成它。