Ruby on Rails: удалить несколько ключей хеша

Если вам не нужно сохранять исходный объект, вы можете его закодировать и создать новый массив уникальных значений. В C # используйте Список, чтобы получить доступ к требуемой функциональности. Это не самое привлекательное или интеллектуальное решение, но оно работает.

int[] numbers = new int[] {1,2,3,4,5,1,2,2,2,3,4,5,5,5,5,4,3,2,3,4,5};
List<int> unique = new List<int>();

foreach (int i in numbers)
     if (!unique.Contains(i))
          unique.Add(i);

unique.Sort();
numbers = unique.ToArray();
144
задан Volte 13 December 2016 в 04:20
поделиться

6 ответов

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

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

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

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

216
ответ дан 23 November 2019 в 22:42
поделиться

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

[:controller, :action, :other_key].each { |k| params.delete(k) }
24
ответ дан 23 November 2019 в 22:42
поделиться

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

params.delete_if { |k,v| [:controller, :action, :other_key].include? k }
13
ответ дан 23 November 2019 в 22:42
поделиться

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

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
8
ответ дан 23 November 2019 в 22:42
поделиться

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

2
ответ дан 23 November 2019 в 22:42
поделиться

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

params.slice!(:param_to_remove_1, :param_to_remove_2)
redirect_to my_path(params)
44
ответ дан 23 November 2019 в 22:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: