2013-10-02 44 views
0

我繼承Devise::PasswordsController爲什麼不

https://github.com/plataformatec/devise/blob/master/app/controllers/devise/passwords_controller.rb

class MyPasswordsController < Devise::PasswordsController 

protected 

    # Reference: https://github.com/plataformatec/devise/blob/master/app/controllers/devise/passwords_controller.rb 
    def unlockable?(resource) 
    v = resource.respond_to?(:unlock_access!) && 
     resource.respond_to?(:unlock_strategy_enabled?) 
     # && resource.unlock_strategy_enabled?(:none) # sets to :none 

puts "##############################" 
puts v 
puts "##############################" 

    return v 
    end 
end 

這個紅寶石覆蓋方法被調用我也有路線:

devise_for :users, :controllers => {:passwords => :my_passwords} 

我敢肯定,Devise::PasswordsController::update被稱爲,但爲什麼紅寶石拿起我的MyPasswordsController::unlockable?方法(它應該在update方法中調用?

編輯

我想要說的是在C以下代碼++。 Ruby的行爲有什麼不同?

#include <iostream> 
using namespace std; 

class Base 
{ 
public: 
    virtual void VirtualMethod() 
    { 
     cout << "Base::VirtualMethod" << endl; 
     VirtualMethodSub(); 
    } 

    virtual void VirtualMethodSub() 
    { 
     cout << "Base::VirtualMethodSub" << endl; 
    } 
}; 

class Dervied : public Base 
{ 
    virtual void VirtualMethodSub() 
    { 
     cout << "Derived::VirtualMethodSub" << endl; 
    } 
}; 

int main() 
{ 
    Dervied d; 
    d.VirtualMethod(); 

    return 0; 
} 
/* Output: 
Base::VirtualMethod 
Derived::VirtualMethodSub 
*/ 

回答

0

您的意見命中PasswordsController#更新。不MyPasswordsController#更新。因此,通過擴展Devise :: Passwords控制器來實現您自己的PasswordsController。

class PasswordsController < Devise::PasswordsController 
    protected 
    def unlockable?(resource) 
    end 
end 

而且在你的config/routes.rb文件,添加

devise_for :users, :controllers => {:passwords => 'passwords'} 

如果你的資源是不是用戶,你的資源名稱替換它。

+0

我已經有了路線。只是讓你知道,如果我重寫'Devise :: PasswordsController :: update',它被調用,並且我的'unlockable?'也被調用。但我不想重寫'update',因爲'super :: update'是我需要的。 –