从子类调用方法导致“没有超类方法`sign_up_params'用于...”。为什么?

时间:2013-07-11 14:23:52

标签: ruby-on-rails ruby devise

背景

我已将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,显然该方法不是私有的。

版本:

  • Rails 3.2.13
  • Ruby 1.9.3
  • Devise 2.2.3

修改 将代码更改为:

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

仍然无效。

2 个答案:

答案 0 :(得分:0)

如果仔细观看,在包括protected在内的一系列方法之前,您会看到sign_up_params

嗯,我不得不说它真的不重要,我使用我的本地仓库所以我可以找到它:)

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

要解决这个问题,我认为您可以将子类中的方法sign_in_params设置为protected,但我还没有验证过。

答案 1 :(得分:0)

虽然基于Devise :: RegistrationsController代码确实存在 Gem v3.0.0 中的方法,但我碰巧安装了Gem v2.2.3。

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