2017-07-28 67 views
0

我想弄清楚如何做一個數據表的過濾器,所以我的想法在臨時是有一個<option>適用於一個參數的URL,和basis的表改變,但是,我的控制器似乎忽略了參數Rails路由與參數 - 控制器忽略參數

def index 
    @steam_games = SteamGame.all 
    @steam_games = SteamGame.where("#{params[:genre]} = ANY (genres)") if params[:genre].present? 
     respond_to do |format| 
     format.html 
     format.json { render json: SteamGamesDatatable.new(view_context, @steam_games) } 
     end 
    end 

是我能想到應用它的最佳方式。

爲了測試我還在 get '/steam_games/:genre', to: 'steam_games_controller#index'中添加了路由,即使我希望URL不會改變。

我的調試器顯示

--- !ruby/object:ActionController::Parameters 
parameters: !ruby/hash:ActiveSupport::HashWithIndifferentAccess 
    genre: indie 
    controller: steam_games 
    action: index 
permitted: false 

負載我看到Parameters: {"genre"=>"indie"}在控制檯中。

爲什麼這不起作用?要注意genres是一個ARRAY,這就是爲什麼我有這樣的where,但是這不應該改變參數綁定。

(不確定鏈接reg。this還有什麼)。

這是可能的Datatables勝過控制器的index,但我不這麼認爲,因爲我把它列入清單。

回答

0

在我看來,這是一個強烈的參數問題。您需要允許使用參數。你可以在你的控制器中嘗試這樣的事情。

def index 
    @steam_games = SteamGame.all 
    @steam_games = SteamGame.where("#{steam_game_params[:genre]} = ANY (genres)") if steam_game_params[:genre].present? 
    respond_to do |format| 
     format.html 
     format.json { render json: SteamGamesDatatable.new(view_context, @steam_games) } 
    end 
end 

private 

def steam_game_params 
    params.permit(:genre) 
end 

Here年代到ActionController::Parameters文檔的鏈接。

+0

我做了改變(這是有道理的,我也沒有在允許範圍內)。但是現在數組不斷被返回爲空。 「SteamGame.where(」'Indie'= ANY(genres)「)。count'作品,我看不到輸出,但我認爲是 SteamGame.where(」'#{steam_game_params [:genre]}' = ANY(流派)「)如果steam_game_params [:流派] .present?' 是否提供了類似的查詢? – DNorthrup

+0

我不確定我完全理解你的新問題,「是否提出類似的查詢?」 ...你添加了強烈的參數後,你的錯誤是否改變了?如果'.count'方法有效,那麼你應該檢查你的參數實際上是否存在。使用'puts SteamGame.where(「#{steam_game_params [:genre]} = ANY(流派)」)'並檢查您的輸出。 –

+0

我會嘗試輸出。把steam_params似乎已經做到了,所以它注意到params,但它不斷返回'nil' - 但是如果我要在Console中對同一'genre'進行查詢,我會得到一個結果。 – DNorthrup