0

因此,我經常在用戶提交給Rails中的POST,PUT或DELETE操作的某些網頁中使用表單,如果提交的內容是我希望它重定向到指定的URL成功。我通常會使用/users之類的路徑創建一個名爲to的隱藏附加參數。所以如果表單提交失敗了,它就停留在那個表單上,但是如果它成功了,那麼瀏覽器會被重定向到/users在Rails中POST後重定向到指定的URL

我想自動尋找此參數始終重定向到它,如果表單提交成功任何控制器/行動。我是否把這個放在ApplicationControllerafter_action

class ApplicationController < ActionController::Base 
    after_action :redirect_if_success 

    private 
    def redirect_if_success 
    redirect_to params[:to] if params[:to] 
    end 
end 

我想我可以檢查請求對象,如果這是一個POST,PUT或DELETE操作。我如何知道提交是成功的? after_action中的redirect_to是否會覆蓋窗體控制器中的任何redirect_to

回答

0

我認爲解決方案是在應用程序控制器中定義私有方法redirect_if_success,但直接在動作中調用它。例如:

class ApplicationController < ActionController::Base 

    private 
    def redirect_if_success(default_ur) 
    redirect_to params[:to] || default_url 
    # or similar logic 
    end 
end 

class UserController < ApplicationController::Base 

    def create 
    redirect_if_success("/users") if @user.save 
    end 
end 
0

我想創建一個helper方法

def redirect_to_location 
    redirect_to params[:to] && params[:to].present? 
end 

,我會在我想這種行爲的每個動作明確地使用它。

但是,您可以嘗試一下。爲了在after_action中保留這個邏輯,你需要設置一些狀態,讓你知道你是否需要重定向。

你可以這樣做:

def save 
    if @user.save 
    @follow_redirect = true 
    end 
end 

和after_action過濾器檢查@follow_redirect標誌。看起來不是一個非常漂亮的解決方案,但它會工作。

您也可以嘗試檢查響應變量,看看你是否已經重定向或渲染的作用:(不知道是否會工作,但很有趣的實驗)

所以,你可以檢查:

如果您尚未重定向/重定向,則需要重定向(操作爲post/put/delete)並且params [:to]存在且

# this is not a copy-paste code but rather to demonstrate an idea 
class ApplicationController < ActionController::Base 
    after_action :redirect_to_location 

    protected 

    def is_redirectable? 
    %w{post put delete}.include?(request.method) && params[:to].present? 
    end 

    def already_redirected? 
    !response.status.nil? # not sure if it would work at all 
    end 

    def redirect_to_location 
    redirect_to params[:to] if is_redirectable? && !already_redirected? 
    end 
end