1

由于 Devise 或 Clearance 等身份验证 gem 使用它们自己的内置控制器,因此在覆盖它们时我有几个问题。每次我尝试覆盖它时,似乎都出现了问题,我不知道究竟是什么导致了错误。

例如,要使用 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

这会取代def new原始设计控制器的部分,还是只是添加到它?意思是说,我是否也必须投入

resource = build_resource({})
respond_with_navigational(resource){ render_with_scope :new }

Devise registrations_controller.rb的 def new 部分的默认行为是什么?

3.) 如果您已登录,Devise 中有一个过滤器会阻止您注册,但我需要覆盖它。我该怎么做呢?我猜它与registrations_controller.rbprepend_before_filter :require_no_authentication, :only => [ :new, :create, :cancel ]的部分有关,但我不太确定。

同样的问题也适用于 Clearance,尽管路径和文件略有不同。(我也要求 Clearance,因为我还没有决定使用哪个身份验证 gem——因为轻量级代码,Clearance 对我很有吸引力,但是 Devise具有我也需要的其他功能)。

4

1 回答 1

1

1)这是正确的。

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

3)如果你覆盖了 RegistrationsController,你可以调用skip_before_filter :require_no_authentication. 这应该完全跳过它,因此如果您在某些情况下需要 before 过滤器,则必须添加另一个 before_filter。

于 2011-12-20T03:21:23.560 回答