Costumo encontrar-me escrevendo isso:
params.delete(:controller)
params.delete(:action)
params.delete(:other_key)
redirect_to my_path(params)
A trilha de exclusões não parece certa e nem:
[:controller, :action, :other_key].each do |k|
params.delete(k)
end
Existe algo mais simples e limpo?
ruby-on-rails
ruby
Mark Westling
fonte
fonte
Hash#except!
masHash#except
é o caminho a seguir (não mexaparams
!). Como regra geral, não mexa com nenhum objeto no local, a menos que seja absolutamente necessário, os efeitos colaterais podem ter resultados inesperados.Respostas:
Suponho que você desconheça o Hash #, exceto o método que o ActiveSupport adiciona ao Hash.
Isso permitiria que seu código fosse simplificado para:
Além disso, você não precisaria atualizar o patch, pois a equipe do Rails fez isso por você!
fonte
except!
fez. Rails 3.0User.attributes.except("id", "created_at", "updated_at")
símbolos não funcionaramattributes
método ActiveRecord retorna aHash
com chaves que sãoString
. Então você teria que usar os nomes das chaves de string.except()
. No entanto, eu contornar isso usando aHash.symbolize_keys
la@user.attributes.symbolize_keys.except(:password, :notes)
- usandosymbolize_keys
faz com que funcione como seria de esperarEnquanto o uso
Hash#except
lida com o seu problema, lembre-se de que ele apresenta possíveis problemas de segurança . Uma boa regra para lidar com os dados dos visitantes é usar uma abordagem da lista de permissões. Nesse caso, usando emHash#slice
vez disso.fonte
{:b=>2, :c=>3}:Hash
Ficaria completamente satisfeito com o código que você postou originalmente em sua pergunta.
fonte
Hash
esta é a melhor resposta: +1:Outra maneira de expressar a resposta de dmathieu pode ser
fonte
Acender um patch de macaco?
fonte
delete(k)
em vez dedelete(key)
delete_keys
deve ser simplesmentedup.delete_keys!(*keys)
Não sei o que você acha que está errado com sua solução proposta. Suponho que você queira um
delete_all
método no Hash ou algo assim? Nesse caso, a resposta de tadman fornece a solução. Mas, francamente, por uma única vez, acho que sua solução é extremamente fácil de seguir. Se você estiver usando isso com frequência, convém agrupá-lo em um método auxiliar.fonte