나는 종종 이것을 쓰는 것을 느낀다.
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
더 간단하고 깨끗한 것이 있습니까?
답변
ActiveSupport가 해시에 추가 하는 Hash # except 메서드를 모르는 것 같습니다 .
코드를 다음과 같이 단순화 할 수 있습니다.
redirect_to my_path(params.except(:controller, :action, :other_key))
또한 Rails 팀이 자동으로 패치했기 때문에 원숭이 패치가 필요하지 않습니다!
답변
사용하면 Hash#except
문제가 해결 되지만 잠재적 인 보안 문제가 발생할 수 있습니다 . 방문자의 데이터를 처리하는 데 유용한 경험 법은 화이트리스트 방식을 사용하는 것입니다. 이 경우 Hash#slice
대신 사용하십시오.
params.slice!(:param_to_remove_1, :param_to_remove_2)
redirect_to my_path(params)
답변
귀하의 질문에 원래 게시 한 코드에 완전히 만족합니다.
[:controller, :action, :other_key].each { |k| params.delete(k) }
답변
dmathieu의 대답을 표현하는 또 다른 방법은
params.delete_if { |k,v| [:controller, :action, :other_key].include? k }
답변
원숭이 패치를 발사?
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
답변
제안한 솔루션에 어떤 문제가 있다고 생각하는지 모르겠습니다. delete_all
해시 또는 다른 방법 을 원한다고 가정하십시오 . 그렇다면 tadman의 답변 이 해결책을 제공합니다. 그러나 솔직히 말하면 귀하의 솔루션은 매우 쉽게 따라 할 수 있다고 생각합니다. 이것을 자주 사용하는 경우 도우미 방법으로 마무리해야 할 수 있습니다.