2016-03-09 133 views
2

問:控制器重定向到不同的路徑依賴上頁

我如何想,重定向到不同路徑後create行動給出如果previous_page是../reader/new../reader/blog/:id,而如果previous_page是../editor/new../editor/blog/:id

釋:

我想修改控制器動作,以便它可以重定向到這取決於頁它來自不同的路徑。例如,我有一個reader,editorblog模型。 readereditor都可以創建一個blog

原來這裏是blogs_controller

class BlogsController < ApplicationsController   
     def create 
     @blog = Blog.new(blog_params) 
     respond_to do |format| 
      if @blog.save 
      format.html { redirect_to @blog } 
      else 
      format.html { render :new } 
      end 
     end 
     end 

     private 

     def blog_params 
     params.require(:service).permit(:title, :content) 
     end 
    end 

回答

4

您有幾種選擇:

  • 使用redirect_to :back控制器如果你需要的是重定向回上一頁
  • 添加一些邏輯處理HTTP引用者,即決定在哪裏重定向基於request.referer在控制器中
  • 將參數中的重定向信息傳遞給create動作,例如,當來自「閱讀器」頁面時,通過params[:redirect_to] = "reader"並根據此參數決定重定向的位置。你甚至可以把整個URI重定向到param並重定向到它(但是這種方法是不安全的,因爲params可能會被用戶破壞)。

一般情況下,我會選擇第三個選項(參數),你必須在重定向過程(前兩個選項依靠其也可通過任何訪客錯位HTTP引用的最佳控制,從而具有潛在的不安全)。

+0

謝謝你,你的第一個和第二個選項的伎倆。但我無法理解最後的選擇。如何傳遞參數[:redirect_to]?你把它放在controller' create'動作中嗎? –

+0

對不起,我的意思是'params [:redirect_to [',讓我進一步解釋。例如,我假設你在'reader/new'動作中有一個表單。然後,您可以爲此表單添加一個隱藏字段並將其設置爲所需重定向的符號值,例如'hidden_​​field_tag:redirect_to,「reader」'。然後,這個參數將作爲'params [:redirect_to]'傳遞給create動作,控制器的'create'動作可以對這個參數作出反應並重定向到所需的閱讀器頁面。我在答案中修正了錯字。 – BoraMa