2013-03-24 55 views
0

過去3天裏我一直在嘲笑我(不開玩笑!!!)....這看起來很簡單,但我無法做到。所以我在這裏提出這個問題,並且願意接受任何可行的方法。更新控制器上的param和調用動作點擊?

背景:提交時的高級搜索表單用於生成對服務器來說太大的URL。所以表單必須通過POST提交。到現在爲止還挺好。表單提交成功,並顯示結果。只剩下問題是分頁。

由於這是一個POST調用,它排除了分頁。雖然will-pagination會將param頁面合併到現有的params中,但問題是它會在url上顯示,導致相同的錯誤。

問:那麼有沒有什麼辦法,如果用戶點擊一個鏈接接下來,我可以

一)更新頁面PARAM

二)保留現有的PARAMS

c)在不更改URL

d)將控制權轉移回控制器中的操作?

迄今爲止唯一的解決方案是隱藏窗體,重新填充窗體的值並重新提交。這個表單非常複雜,所以如果有更清晰的方式我想知道。

回答

1

我看到你想要從你的評論。所以相應地編輯我的回覆。你想要的信息是哪一列在排序中被選中可供控制器使用,而不需要在url字符串中提供這些信息,並且你希望使用GET來獲得這種不是POST的信息

你的挑戰是你想保持請求之間的狀態,你需要一個機制來做到這一點。 POST通過在POST請求的主體中發送信息來保留該信息。 GET通過允許您填充查詢字符串來完成此操作。另一種保存狀態的方法是使用cookie。

您可以在頁面上使用JavaScript處理網址。有關於此的在線教程。

但是,如果你只是想在你的評論中說一個簡單的控制器黑客,那麼我能想到的最簡單的方法就是允許用戶使用查詢參數對URL進行GET請求,然後處理請求分兩步進行 - 第一步將查詢信息保存到cookie中,第二步將它們重定向到刪除了查詢字符串數據的url,然後在構建該頁面的數據之前查看cookie是否具有這些字段。這是hacky,但它的作品。

def sort 
    session[:sort] = params[:sort] 
    redirect_to url_without_the_query_string 
end 

也有新的HTML 5功能:

window.history.replaceState(「Replace」, 「Page Title」, 「/mypage」); 

從這個StackOverflow的答案在這裏:How to remove query string from url using javascript

但是我不知道我會建議用負載後的網址搞亂就像那樣(我對這個解決方案不夠了解,所以我建議你閱讀這個答案,看看是否合適)。因此,如果您必須從url字符串中丟失該數據,因爲您需要以某種方式在請求之間傳遞它,您必須使用POST,或使用上述的會話Cookie /重定向方法。

+0

不,我絕對不是在尋找這個。我的表單方法是POST。表格成功申請。之後,我得到了一組結果,頁面上有50個條目,點擊時可以對列進行排序。現在提交表單後,我的網址不會改變。直到這裏,我很高興,生活很棒。但是當我點擊可排序的鏈接或意願分頁的鏈接時,它們會將params合併到我的url中,而不是僅保存它們。所以我正在尋找一種黑客攻擊手段,在控制器內部,我可以剝去這些參數的網址,而我仍然可以通過params訪問這些網址。我有道理嗎? – 2013-03-24 08:45:15

+0

我這麼認爲。您希望用戶能夠點擊列標題。這通常會將sort_column = foo添加到url中的查詢字符串中,然後重新加載將該params [sort_column]設置爲foo以便正確顯示字段的頁面。但是,您不希望顯示?sort_column = foo。所以你的網址仍然是http:// site_url/orders/advanced_search而不是http:// site_url/orders/advanced_search?sort_column = foo – 2013-03-24 08:51:38

+0

是的,你完全理解了我的問題。現在任何運氣與答案? :) – 2013-03-24 09:03:48

0

您的html <form>是否有action屬性?如果不是,請添加一個指向該頁面的指針。

如果您想保留當前的GET參數,以便POST的結果可以使用,您還需要修改在標題鏈接上觸發的JavaScript,以便(或者不是)修改查詢字符串,他們將相同的數據寫入隱藏的表單域(這當然會在請求的主體中發佈)。你的JS庫可能已經包含了有用的功能。

相關問題