由于认证宝石(如Devise或Clearance)使用自己的内置控制器,因此在覆盖它们时我会遇到一些问题。每当我试图覆盖它时,似乎出现了问题,我不知道究竟是什么导致了错误。
例如,要使用Devise创建一个新的用户控制器我明白我必须创建一个这样的控制器:
# app/controllers/registrations_controller.rb
class RegistrationsController < Devise::RegistrationsController
一切都好。现在让我们说我想将某些内容添加到控制器的def new
部分。
1。)要离开控制器的def create
部分,我必须放入
def create
super
end
是吗?或者我甚至需要在新控制器中引用它?
2。)如果我输入
def new
#my custom code here
end
是否会替换原始Devise控制器的def new
部分,还是只添加它?意思是说,我还必须加入
resource = build_resource({})
respond_with_navigational(resource){ render_with_scope :new }
这是Devise registrations_controller.rb的def新部分的默认行为?
3。)Devise中有一个过滤器,如果您已登录,则会阻止您注册,但我需要覆盖它。我该怎么做呢?我猜它与registrations_controller.rb的prepend_before_filter :require_no_authentication, :only => [ :new, :create, :cancel ]
部分有关,但我不太确定。
同样的问题适用于Clearance,虽然路线和文件略有不同..(我也要求Clearance因为我还没有决定使用哪个认证宝石 - 由于轻量级代码,Clearance对我很有吸引力,但Devise还有我需要的其他功能。
答案 0 :(得分:1)
1)这是正确的。
2)如果要调用父级逻辑,可以在子类逻辑中的适当位置调用super
。
3)如果覆盖RegistrationsController,则可以调用skip_before_filter :require_no_authentication
。这应该完全跳过它,所以如果你在某些条件下需要before filter,你就必须添加另一个before_filter。