2011-04-25 58 views
3

我試圖在用戶通過設計確認後確認其帳戶後將用戶路由到自定義歡迎頁面。自定義頁面位於/ districts/setup /,可通過districts_setup_path訪問。Rails3爲可確定的模塊設計自定義路由

要做到這一點,我添加了自定義路由,

 
    devise_for :users, :controllers => { :registrations => 'registrations', :confirmations => 'confirmations' } 

,並創建了自己的控制器。然後,我有超載confirmations_controller.rb,現在有:

(應用程序/控制器/ confirmations_controller.rb)

 
class ConfirmationsController | Devise::ConfirmationsController 

    # GET /resource/confirmation?confirmation_token=abcdef 
    def show 
    self.resource = resource_class.confirm_by_token(params[:confirmation_token]) 

    if resource.errors.empty? 
     set_flash_message(:notice, :confirmed) if is_navigational_format? 
     sign_in(resource_name, resource) 
     redirect_to districts_setup_path 
    else 
     render_with_scope :new 
     # not: 
     # respond_with_navigational(resource.errors, :status => :unprocessable_entity){ 
    end 
    end 
end 

這種運作良好,但我很緊張,我不是在mostideal這樣做和健壯的方式。特別是,我剛剛刪除了我真的不明白的respond_with_navigational(...)行。

我希望將這一切寫成Devise wiki的操作方法,我只是在尋找對軌道相當新的反饋,甚至更新的Devise/engines/warden。

+0

我一直在測試這個,它似乎工作正常。 – bonhoffer 2011-04-27 02:59:23

+0

不應該有辦法只寫一個提供正確路徑的幫助方法嗎?我也想弄清楚這一點。 – RyanJM 2011-06-01 22:32:31

回答

1

看看Devise的ConfirmationsController,你可以發現受保護的方法after_confirmation_path_for(resource_name, resource)。覆蓋它(而不是整個行動)將以較少的努力產生相同的結果。

一般來說,覆蓋Devise的控制器沒有問題,因爲它們表示默認行爲並不總是適合應用程序需求。這就是說,你必須重寫設計的代碼之前採取的幾件事情:

  1. 設計是不是系統的另一種成分 - 它處理用戶身份驗證,這是一個非常敏感的問題。確保在提交之前不要破壞任何重要內容。您可以通過從github分支Devise項目,進行更改並運行測試來完成此操作。
  2. 當您對設計進行更改並覆蓋其代碼時,升級到較新的版本會變得更加困難,這可能與您的更改不兼容。
  3. 如果您決定做出改變,尋找可能的最小改變來實現您的目標。在大多數情況下,Devise的團隊已經預見到在某些地方需要進行定製,並留下專用於此的方法(如上所述)。同樣,在Devise的GitHub上查看該文件的代碼會給你一個好主意,以便根據你的需求定製它的行爲的最佳方式是什麼。