[ruby-on-rails] Ruby on Rails : 여러 해시 키 삭제

나는 종종 이것을 쓰는 것을 느낀다.

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의 답변 이 해결책을 제공합니다. 그러나 솔직히 말하면 귀하의 솔루션은 매우 쉽게 따라 할 수 있다고 생각합니다. 이것을 자주 사용하는 경우 도우미 방법으로 마무리해야 할 수 있습니다.


답변