2014-01-22 44 views
0

我有一個用戶可以更改密碼的設計表單。我做了一個自定義重定向,以便在提交表單(而不是設計默認根頁面)後返回編輯密碼頁面。這是自定義重定向代碼:Ajax設計更新表單只在沒有表單錯誤時才起作用

class RegistrationsController < Devise::RegistrationsController 

    protected 

    def after_update_path_for(resource) 
     puts 'redirect is happening' #This is so I can see it in the server logs 
     flash[:notice] = "Account succesfully updated" 
     edit_user_registration_path 
    end 
end 

路線:

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

唯一的問題是,這隻會做重定向到編輯頁面密碼,如果密碼變更成功。如果沒有(可以說用戶輸入了錯誤的密碼確認),它仍然會重定向到根頁面。有沒有人知道如何在出現錯誤時正確工作?

UPDATE:

這事做的事實,我提出通過AJAX的形式。更新成功後,會觸發after_update_path_for方法,並將用戶重定向到配置爲返回javascript的edit_user_registration_path。問題是如果after_update_path_For方法沒有被觸發,它會像通常的失敗一樣呈現edit_user_registration_path,除非它將它呈現爲html,並且我已經創建了它,所以頁面只能通過javascript呈現。有任何想法嗎?

回答

0

的設計,默認RegistrationsController更新方法是這樣的:

def update 
    self.resource = resource_class.to_adapter.get!(send(:"current_#{resource_name}").to_key) 
    prev_unconfirmed_email = resource.unconfirmed_email if resource.respond_to?(:unconfirmed_email) 

    if update_resource(resource, account_update_params) 
     yield resource if block_given? 
     if is_flashing_format? 
     flash_key = update_needs_confirmation?(resource, prev_unconfirmed_email) ? 
      :update_needs_confirmation : :updated 
     set_flash_message :notice, flash_key 
     end 
     sign_in resource_name, resource, :bypass => true 
     respond_with resource, :location => after_update_path_for(resource) 
    else 
     clean_up_passwords resource 
     respond_with resource 
    end 
    end 

的「其他」是你無效重​​定向發生。您可以將該方法複製到自己的RegistrationsController中,並在調用編輯路徑時覆蓋「respond_with resource」調用。有可能是一個更優雅的解決方案,但我對AJAX不太好。也許有什麼需要你去重寫Devise的respond_with方法呢?