2013-07-11 95 views
0

背景从子类中调用方法会导致“无超类方法`sign_up_params'for ...”。为什么?

我有子类Devise::RegistrationsController来处理用户注册自己与一个名为DeviseUsersController类。

我需要覆盖create行动 - 我以前使用super然后执行额外的事情需要完成,但是,这不再满足我的要求。

所以我检查了devise code on github并试图通过一些调整重新创建它。但是,我不得不开始于第一线的问题...

守则

class DeviseUsersController < Devise::RegistrationsController 
    ... 

    def build_resource 
    super 
    end 

    def sign_up_params 
    super 
    end 

    def create 
    build_resource(sign_up_params) 
    ... 
    end 

end 

的错误

super: no superclass method `sign_up_params' for #<DeviseUsersController:0x007f8f2d09a538> 

问题

为什么发生此错误?基于Devise::RegistrationsController code,显而易见的是,这种非私有的方法存在。

版本:

  • 滑轨3.2.13
  • 红宝石1.9.3
  • 设计2.2.3

EDIT 代码更改为:

class DeviseUsersController < Devise::RegistrationsController 
    ... 

    def create 
    build_resource(sign_up_params) 
    ... 
    end 

    protected 

    def build_resource 
    super 
    end 

    def sign_up_params 
    super 
    end 

end 

仍然不起作用。

回答

0

尽管基于Devise :: RegistrationsController代码,该方法存在于Gem v3.0.0中,但我碰巧安装了Gem v2.2.3。

我决定使用gem unpack devise来查看我安装的版本的源代码。控制器的实现与v3.0.0不同,并且确实没有sign_up_params方法。

0

如果你仔细观察,你会看到protected之前一堆方法,包括sign_up_params

好吧,我不得不说,它真的不显著,我用我的本地回购,所以我可以找到它:)

在你的子类,你的方法sign_up_params是一个公共方法。事实上,父类中实际上没有这样的公共方法。错误是正确的。

为了解决,我认为你可以在子类中设置方法sign_in_params作为保护,虽然我没有证实。

+0

不幸的是,这并没有解决问题。请参阅编辑的文章 – user2460234

+0

@ user2460234,当你说“没有解决问题”,你会给出具体的错误,我没有办法知道一般“没有工作” –

+0

我很抱歉,因为我只编辑我的代码部分问题我认为很明显,错误是完全一样的。 – user2460234

相关问题