Rails 同個controller底下不同action傳值

陳漢庭
3 min readOct 7, 2020

--

目前遇到的情境為,某一頁在做查詢動作的時候需要回傳。直覺上來看,當我們在index頁面搜尋出結果之後,應該可以把搜尋到的結果存到某一個地方,再給export_result使用。

def index
return if !!params[:search]
Do ransacking...
end
# 匯出按鈕只有在有搜尋結果的情況才會出現
def export_result
Do ransacking... (The same ransacking action in index action)
end

原本的做法是,在2個controller裡面各做一次query,這時候心裡想著:如果能夠把index query的資料存起來就好了,便把腦筋動到session。

首先我把這些資料存進session用,讓index query出來的結果可以給export_result使用,但因為query出來的結果太多了,所以new-relic那邊顯示錯誤。在rails的session是用cookie實作,當資料筆數太多很快就會超過4kb就會爆掉,這個門檻在query多筆的情境很快就會滿出來。

後來想到controller有個特殊的方法叫action_name,那如果這樣寫的話或許有辦法,我們可以把getter, setter寫在query_products裡面

def index
return if !!params[:search]
Do ransacking...
end
# 匯出按鈕只有在有搜尋結果的情況才會出現
def export_result
Do ransacking... (The same ransacking action in index action)
end
def query_products
return `Do ransacking and save to @query_products` if action_name == index
@query_products
end

但這方法顯然是沒有辦法成功,當執行到export_result之後,@query_products這個實體變數會重新變成nil,它不會幫我們在index就把@query_products存起來

上網查了這篇還蠻有參考價值,但不適用這裡的情境。解答者提供兩個方法,一個是使用session,另外一個是在redirect的時候把資料傳過去。前者的方法已經試過是不行的,後者目前沒有任何的情境遇到。除了Stackoverflow提到的兩個方法,還有個方法是在hidden layer存取對應的name, value,讓export_result的方法改為post利用表單的方式送出去,但因資料筆數過大(10萬筆),評估還是認為兩個action個別query一次的方法在這邊是最適合的。

--

--

陳漢庭
陳漢庭

Written by 陳漢庭

由於零散的紀錄過了一段時間之後就看不懂了,於是為了強迫自己用故事的方式記錄學到的東西,就開啟我的發文之路。

No responses yet