2010-12-30 12 views
2

キー/値のペアを追加/削除/変更する機能を含む、名前付きルートにparamsハッシュを渡すより効率的な方法が必要です。より効率的にRails paramsハッシュを名前付きルートに渡す

キーを追加

# adds the company filter 
link_to_unless params[:company]==company, company, jobs_path(:company=>company, :posted=>params[:posted],:sort=>params[:sort],:dir=>params[:dir]) 

キーの取り外しが(排除:会社のシンボル):paramsハッシュの残りの部分(手動で各シンボル/値を指定する)を維持しながら、(会社のシンボル)が、 (手動で各シンボル/値を指定する)paramsハッシュの残りを保持:

# create a link that removes the company filter 
link_to_unless_current 'x', jobs_path(:posted=>params[:posted],:sort=>params[:sort],:dir=>params[:dir]) 

私は直接ハッシュのparamsを渡すと考え、それは例外をスロー:

link_to_unless params[:company]==company, company, jobs_path(params) 

私はDRYerの代替品がほしいと思っています。

+0

どのような例外がスローされますか? –

+0

経路が一致しません{:dir => 'ASC'、...} – craig

答えて

1

:代わりに、キー/値のペアのハッシュを渡すビューコードリファクタリング

def options(hash) 
    o={:employer=>params[:employer],:location=>params[:location],:posted=>params[:posted],:starting=>params[:starting],:sort=>params[:sort],:dir=>params[:dir],:fav=>params[:fav]} 
    # add the contents of hash, overwriting entries with duplicate keys 
    o.merge!(hash) 
end 

と、優れた柔軟性:

<%= link_to_unless params[:employer]==employer, employer, jobs_path(options({:employer=>employer})) %> 

<%= link_to_unless_current '✗', jobs_path(options({:employer=>nil})) %> 
0

このアプローチは動作しますが、最適ないないようです:

ヘルパー:

def options(key, value) 
    # create a hash of all params 
    o={:employer=>params[:employer],:posted=>params[:posted],:starting=>params[:starting],:sort=>params[:sort],:dir=>params[:dir]} 
    # set value 
    o[key]=value 
    # return hash 
    o 
end 

ビュー:

# change symbol's value 
<%= link_to_unless params[:employer]==employer, employer, jobs_path(options(:employer, employer)) %> 

# remove symbol 
<%= link_to_unless_current '✗', jobs_path(options(:employer, nil)) %> 

私はparamsハッシュで作業することができるはずですように思えます直接、しかしこれは今のところ動作します。ヘルパー機能リファクタリング

0

リファクタリングバージョン。これをターゲットコントローラに入れて、グローバルにはならないようにしてください:

# new_params: new parameters you wish to pass on 
# white_list: array of symbols, representing additional keys from existing params which you wish to pass on 
def options(new_params, white_list = []) 
    white_list += [ :employer,:location,:posted,:starting,:sort,:dir,:fav ] 
    white_list.uniq! 
    new_params.reverse_merge(params.slice(white_list)) 
end 
helper_method :options 
関連する問題