Ruby on Rails: удалить несколько ключей хеша - PullRequest
142 голосов
/ 13 октября 2009

Я часто пишу это:

params.delete(:controller)  
params.delete(:action)  
params.delete(:other_key)  
redirect_to my_path(params)  

Список удалений не выглядит правильным и не выглядит так:

[:controller, :action, :other_key].each do |k|
  params.delete(k)
end

Есть ли что-нибудь попроще и чище?

Ответы [ 6 ]

213 голосов
/ 13 октября 2009

Я предполагаю, что вы не знаете о Hash #, кроме метода, который ActiveSupport добавляет в Hash.

Это позволило бы упростить ваш код до:

redirect_to my_path(params.except(:controller, :action, :other_key))

Кроме того, вам не понадобится обезьяна-патч, поскольку команда Rails сделала это за вас!

44 голосов
/ 14 октября 2009

При использовании Hash#except решает вашу проблему, имейте в виду, что она создает потенциальные проблемы безопасности . Хорошее практическое правило для обработки любых данных от посетителей заключается в использовании подхода белого списка. В этом случае вместо Hash#slice.

params.slice!(:param_to_remove_1, :param_to_remove_2)
redirect_to my_path(params)
23 голосов
/ 13 октября 2009

Я был бы полностью доволен кодом, который вы изначально разместили в своем вопросе.

[:controller, :action, :other_key].each { |k| params.delete(k) }
12 голосов
/ 13 октября 2009

Другой способ сформулировать ответ dmathieu:

params.delete_if { |k,v| [:controller, :action, :other_key].include? k }
8 голосов
/ 13 октября 2009

Запустить патч обезьяны?

class Hash
  def delete_keys!(*keys)
    keys.flatten.each do |k|
      delete(k)
    end

    self
  end

  def delete_keys(*keys)
    _dup = dup
    keys.flatten.each do |k|
      _dup.delete(k)
    end

    _dup
  end
end
2 голосов
/ 13 октября 2009

Я не знаю, что вы думаете не так с вашим предложенным решением. Я полагаю, вы хотите метод delete_all на хэш или что-то? Если так, то ответ Тедмана дает решение. Но, честно говоря, для разового, я думаю, что ваше решение очень легко следовать. Если вы используете это часто, возможно, вы захотите обернуть его вспомогательным методом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...