关于覆盖Devise或Clearance控制器

时间:2011-12-20 02:23:14

标签: ruby-on-rails devise controllers clearance

由于认证宝石(如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.rbprepend_before_filter :require_no_authentication, :only => [ :new, :create, :cancel ]部分有关,但我不太确定。

同样的问题适用于Clearance,虽然路线和文件略有不同..(我也要求Clearance因为我还没有决定使用哪个认证宝石 - 由于轻量级代码,Clearance对我很有吸引力,但Devise还有我需要的其他功能。

1 个答案:

答案 0 :(得分:1)

1)这是正确的。

2)如果要调用父级逻辑,可以在子类逻辑中的适当位置调用super

3)如果覆盖RegistrationsController,则可以调用skip_before_filter :require_no_authentication。这应该完全跳过它,所以如果你在某些条件下需要before filter,你就必须添加另一个before_filter。