Я часто пишу это:
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
Есть ли что-нибудь попроще и чище?
ruby-on-rails
ruby
Марк Вестлинг
источник
источник
Hash#except!
ноHash#except
это путь (не связывайтесьparams
!). Как правило, не связывайтесь с каким-либо объектом на месте, если это не требуется, побочные эффекты могут иметь неожиданные результаты.Ответы:
Я предполагаю, что вы не знаете о Hash #, кроме метода, который ActiveSupport добавляет в Hash.
Это позволило бы упростить ваш код до:
Кроме того, вам не нужно будет собирать патчи, поскольку команда Rails сделала это за вас!
источник
except!
сделал. Rails 3.0User.attributes.except("id", "created_at", "updated_at")
символы не работалиattributes
метод ActiveRecord возвращает aHash
с ключами, которые естьString
. Тогда вам придется использовать имена строковых ключей в.except()
. Однако яHash.symbolize_keys
@user.attributes.symbolize_keys.except(:password, :notes)
symbolize_keys
При использовании
Hash#except
решает вашу проблему, имейте в виду, что это создает потенциальные проблемы безопасности . Хорошее эмпирическое правило для обработки любых данных от посетителей заключается в использовании подхода белого списка. В этом случае используетсяHash#slice
вместо.источник
{:b=>2, :c=>3}:Hash
Я был бы полностью доволен кодом, который вы изначально разместили в своем вопросе.
источник
Hash
это лучший ответ: +1:Другой способ сформулировать ответ дматью:
источник
Запустить обезьяну?
источник
delete(k)
вместоdelete(key)
delete_keys
должна быть простоdup.delete_keys!(*keys)
Я не знаю, что вы думаете не так с вашим предложенным решением. Я полагаю, вы хотите
delete_all
метод Hash или что-то еще? Если так, то ответ Тэдмана дает решение. Но, честно говоря, я считаю, что за вашим решением очень легко следовать. Если вы используете это часто, вы можете заключить его в вспомогательный метод.источник