2011-12-20 64 views
1

由於認證寶石,如Devise或Clearance使用他們自己的內置控制器,我覆蓋它們時有幾個問題。每次嘗試覆蓋它時,都會出現錯誤,我不知道是什麼原因導致了錯誤。關於覆蓋設計或清除控制器

例如,創建具有制定一個新的用戶控制器我明白我必須這樣創建一個控制器:

# 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新零件的默認行爲?

3.)Devise中有一個過濾器可以防止您在註冊時註冊,但我需要重寫此過濾器。我該怎麼做呢?我猜這與registrations_controller.rbprepend_before_filter :require_no_authentication, :only => [ :new, :create, :cancel ]部分有關,但我不太確定。

同樣的問題適用於清除,雖然路線和文件略有不同。(我要求清理也是因爲我還沒有決定使用哪個認證寶石 - 清理吸引我,因爲輕量級代碼,但設計有我需要的其他功能)。

回答

1

1)這是正確的。

2)如果你想調用父母的邏輯,你可以在子類邏輯的適當位置調用super

3)如果您覆蓋RegistrationsController,則可以撥打skip_before_filter :require_no_authentication。這應該完全跳過它,所以如果你在某些條件下需要之前的過濾器,你將不得不添加另一個before_filter。

+0

謝謝。我發誓我讀了維基上的每一個字,但在任何地方都找不到。只是一個後續問題:如果我只需要更改控制器的「def new」部分,是否需要將def創建超級(和def編輯,def更新等)放在新的registrations_controller.rb以及? – cdotfeli 2011-12-20 06:21:39

+0

不,你應該只能定義你想改變的方法。 – 2011-12-20 14:17:40