Более эффективный способ передать хэш параметров Rails на именованный маршрут - PullRequest
3 голосов
/ 30 декабря 2010

Мне нужен более эффективный способ передачи хэша params поименованному маршруту, включая возможность добавлять / удалять / изменять пару ключ / значение.

Добавление ключа (символа: company) с сохранением оставшейся части хэша 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])

Удаление ключа (исключает символ: company) с сохранением оставшейся части хэша 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 )

Я надеюсь на некоторые альтернативы для СУШКИ.

Ответы [ 3 ]

1 голос
/ 05 января 2011

Рефакторинг вспомогательной функции:

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 голосов
/ 26 апреля 2013

Рефакторированная версия. Поместите это в целевой контроллер, чтобы он не был глобальным:

# 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
0 голосов
/ 30 декабря 2010

Этот подход работает, но не кажется оптимальным:

помощник:

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 напрямую, но пока это будет работать.

...