背景
我已将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,显然该方法不是私有的。
版本:
修改 将代码更改为:
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 :(得分: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
方法。