2015-11-05 76 views
0

鑑於以下簡化的情況(在現實中,情況是從ActiveAdmin支持的應用程序):否決先前在redirect_to的控制器

class ShapeController < ApplicationController 
    def update 
    (...) 
    redirect_to 
    end 
end 

class CircleController < ShapeController 
    def update 
    super 
    (...) 
    redirect_to 
    end 
end 

調用CircleController#update將導致著名的「一個AbstractController :: DoubleRenderError」因爲redirect_to被稱爲兩次。

現在,我無法阻止第一次撥打電話redirect_tosuper,至少不能搞亂ActiveAdmin的代碼。是否有另一種方法取消第一個redirect_to並推翻另一個?

感謝您的提示!

回答

1

ActiveAdmin使用Inherited Resources做執行標準的REST動作。 gem提供了覆蓋respond_to塊的方法。我以前從來沒有嘗試這一點,但,這可能是你的情況有所幫助:

ActiveAdmin.register Circle do 
    # ... 

    controller do 
    def update 
     update! do |success, failure| 
     failure.html { redirect_to circle_url(@circle) } 
     end 
    end 
    end 

    # ... 
end 

參考IR寶石文檔,更多的選項覆蓋行動(下改寫動作部分)。

+0

不錯,謝謝你的提示! – svoop

0

我會說這是不可能的。最好的解決辦法是提取一些保護控制器方法的操作代碼,並從孩子控制器叫它:

class ShapeController < ApplicationController 
    def update 
    do_the_update 
    redirect_to 
    end 

    protected 

    def do_the_update 
    # your code 
    end 
end 

class CircleController < ShapeController 
    def update 
    do_the_update 
    redirect_to 
    end 
end 
+0

正如我所說,我知道如何解決這個在ShapeController。但由於這將在ActiveAdmin寶石中,我正在尋找另一種解決方案。 – svoop

+0

@svoop:我想現在沒有解決方法,對不起 –

相關問題