2017-01-17 81 views
0

的Rails 4.2,並制定5重定向時signout設計軌道

我使用這個code我application_controller.rb重定向用戶到同一頁面時,他們登出

def after_sign_out_path_for(resource_or_scope) 
    request.referrer || root_path 
end 

一切正常很好,當用戶點擊退出時,他們會退出並保持在同一頁面上。

但是,如果用戶試圖註銷失敗的驗證編輯配置文件*應用程序會引發錯誤。日誌說「的ActionController :: RoutingError(無路由匹配[GET]‘/用戶’)。

任何想法,以提高代碼?

*(例如,當用戶試圖更改用戶名和它已經採取的形式給予驗證錯誤和用戶註銷)

回答

0

解決你的問題,你可以處理這樣的路由錯誤:

class ApplicationController < ActionController::Base 
    rescue_from ActionController::RoutingError, with: :handle_routing_error 

    # added 
    def routing_error 
    raise ActionController::RoutingError.new(params[:path]) 
    end 

    private 

    def handle_routing_error 
     redirect_to root_path, alert: "some alert text" 
    end 
end 

下一頁添加到非常結束Rails.application.routes.drawroutes.rb

match "*path", to: "application#routing_error", via: :all 

塊所以,如果你沒有上次訪問的URL返回到root_path。如果你確實有最後一次訪問過的網址,那麼你回到它。如果它不好(像驗證用例一樣),則返回到root_path。

+0

嗨..試試這個。但我可以得到這個工作。對不起:(有人說救援可能無法正常工作[https://coderwall.com/p/whjmra/handling-exceptions-in-your-rails-application] – Aipack

+0

@Aipack。哦,對不起!我忘了一個小小的代碼段,你應該添加到routes.rb和ApplicationController中的一個方法。我的不好。更新了答案。現在就試試吧! – VAD

+0

@Aipack。** PS **我的答案現在在我自己的項目中工作,所以它已經完全測試。 – VAD

0

你可以做這樣的事情,

def after_sign_out_path_for(resource_or_scope) 
    if current_user 
    request.referrer 
    else 
    root_path 
    end 
end 

但我做的是具有application_controller.rb

application_controller.rb相同after_sign_out_path_for方法

def after_sign_out_path_for(resource_or_scope) 
    request.referrer || root_path 
end 

然後添加before_action :authenticate_user!在您的控制器中使用所有需要user的方法進行回調。與此類似,

users_controller.rb

class UsersController < ApplicationController 
    before_action :authenticate_user!, only: [:show, :edit, :update, :destroy] 

    def show 
    end 

end 

當用戶註銷,而編輯個人資料頁上,它會嘗試他重定向到同一頁面,但調用users_controller.rbedit行動之前,這樣,你的before_action正在調用回調,用戶將自動重定向到登錄頁面。

這絕對是我喜歡的,但你可能不需要它,所以你應該選擇第一個解決方案。

+0

嗨,謝謝。爲答案。我試過你的第一個解決方案,不幸的是它仍然會拋出同樣的錯誤。我還沒有創建一個user_controller.rb。我正在使用設計用戶控制器來更改配置文件。它看起來像request.referrer只是在不知道控制器或動作需要採取的情況下捕捉鏈接。 PATCH /users(.:format)設計/註冊#更新 – Aipack

+0

對不起,我更新了我的答案,使用更新後的'after_sign_out_path_for'方法使其工作。 –

+0

嗨..用你的答案更新,但現在當用戶sign_out時,一切都重定向到root_path ..臨時我使用骯髒的黑客'如果URI(request.referer).path ==「/ users」'然後重定向到其他使用請求引用。在'after_sign_out_path_for'方法中 – Aipack