0

背景

我已经Devise::RegistrationsController使用一个名为DeviseUsersController.

我需要覆盖该create操作 - 我之前使用super然后执行了需要完成的其他事情,但是,这不再满足我的要求。

所以我检查了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 代码,很明显该方法不是私有的,存在。

版本:

  • 导轨 3.2.13
  • 红宝石 1.9.3
  • 设计 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

还是不行。

4

2 回答 2

0

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

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

于 2013-07-18T21:08:43.900 回答
0

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

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

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

要解决,我认为您可以将sign_in_params子类中的方法设置为受保护,尽管我尚未验证。

于 2013-07-11T15:14:41.797 回答