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被调用了,但是为什么 ruby​​ 不选择我的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
 */
4

2 回答 2

0

您查看点击 PasswordsController#update。不是 MyPasswordsController#update。因此,通过从 Devise::Passwords 控制器扩展来实现您自己的 PasswordsController。

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

在你的 config/routes.rb 中,添加

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

如果您的资源不是用户,请将其替换为您的资源名称。

于 2013-10-02T18:53:20.577 回答
0

原来我使用的是 Devise 2.1.2,链接: https ://github.com/plataformatec/devise/blob/master/app/controllers/devise/passwords_controller.rb

适用于最新版本的设计。

于 2013-10-02T21:45:36.623 回答