2010-07-03 34 views
16

在我的應用程序中,我有一個出現在每個頁面上的小框,用於檢查用戶發出的請求的狀態。如果任何時候接受請求,那麼用戶應該自動被帶到某個頁面。這是到目前爲止我的代碼:我可以在RoR的視圖中使用redirect_to嗎?

<% offersMade.each do |w| %> 
    <% if w.accepted == true %> 
    <% redirect_to offer_path(:email => "[email protected]") %> 
    <% end %> 
<% end %> 

但我發現了這個錯誤:

undefined method `redirect_to' for #<ActionView::Base:0x1042a9770> 

是沒可能給用戶redirect_to的一個看法?如果不是,還有什麼我可以使用的?謝謝閱讀。

回答

29

redirect_to是一個ActionController :: Base類的方法,所以你不能在ActionView中使用它。

你可以嘗試以下

<% if w.accepted == true %> 
    <script type="text/javascript"> 
    window.location.href="/logins/sign_up" // put your correct path in a string here 
    </script> 
<% end %> 

編輯的電子郵件參數

window.location.href="/logins/sign_up?email=<%= w.email %>" 

對不起,我不知道是否有在紅寶石的事情。

+0

謝謝,這個作品很棒。你知道是否有一種方法可以在URL構造中使用RoR變量?在我最初的代碼中,我有(:email =>「[email protected]」),我不確定我是否可以在JavaScript中做類似的事情? – ben 2010-07-03 06:16:33

+0

檢查我編輯的答案。 – Salil 2010-07-03 06:20:06

+0

非常感謝,它的工作原理!我不認爲你可以在js中嵌入紅寶石,但顯然你可以。再次感謝! – ben 2010-07-03 06:25:05

1

redirect_to不是ActionView的方法。它的一種方法ActionController。您可以在頁面加載或某些其他事件中使用Javascript window.location.href將用戶轉到其他頁面。

+1

感謝您的幫助,不知道這一點。 – ben 2010-07-03 06:17:06

6

視圖中的代碼可以移入控制器,這將使redirect_to可用。

class ApplicationController < ActionController::Base 
    before_action :check_for_accepted_offer 

    def check_for_accepted_offer 
    if Offer.any? { |o| o.accepted } 
     redirect_to offer_path(:email => "[email protected]") 
    end 
    end 
end 

如果OP要立即更改URL時的報價被接受,然後在沒有答案表示將幫助,因爲加載頁面時,只計算了Ruby代碼。該任擇議定書需要安裝某種形式的投票或推動戰略的提醒瀏覽器時的報價已經被接受,然後使用JavaScript重定向張貼在另一個答案方案:

window.location.href="/logins/sign_up?email=<%= w.email %>" 

雖然,這並不回答這個問題:「我怎樣才能在視圖中使用redirect_to」,我認爲這個答案最終會對OP更有用。我偶然發現有人使用這個答案重定向到另一個頁面,當重定向應該在控制器中執行時。

0

是的,你可以從你的視圖中調用controller.redirect_to來得到你想要的,而不必渲染整個響應,然後在客戶端使用javascript來發出新的請求。

在您的例子,這將是這樣的:

<% offersMade.each do |w| %> 
    <% if w.accepted == true %> 
    <% controller.redirect_to offer_path(:email => "[email protected]") %> 
    <% end %> 
<% end %> 

注意這controller.redirect_to不會打破你的循環,所以你可能會想break,你可能會想,以確保如果你沒有重定向,你的視圖的其餘部分只是有條件地呈現。正如其他人所說的那樣,在控制器或助手中這樣做會更好。)

16

如果你想使用redirect_to時從視圖中,做到這一點的方法:

語法: <%controller.redirect_to路徑%>

例如: <%controller.redirect_to users_profile_path%>

+3

這是一個很好的方式來做到這一點本地化,避免JavaScript! – 2017-04-08 22:52:43

+0

當我使用這個,我需要單詞'控制器',而不是控制器的名稱。這很好。 – 2017-10-17 18:46:49

相關問題