Более эффективный способ передачи хэша параметров Rails с указанным маршрутом
Мне нужен более эффективный способ передачи хэша params по именованному маршруту, включая возможность добавления/удаления/изменения пары ключ/значение.
Добавление ключа (символа компании), сохраняя при этом оставшуюся часть хэша 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 (вручную указывать каждый символ/значение):
# 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.
Ответы
Ответ 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}) ) %>
Ответ 2
Этот подход работает, но не кажется оптимальным:
хелперов:
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 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 напрямую, но это будет работать пока.
Ответ 3
Реализованная версия. Поместите это в целевой контроллер, чтобы он не был глобальным:
# 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