2011-05-13 5 views
2

이 분명히 작동하지 않습니다경로 도우미를 통해 매개 변수를 가장 쉽게 전달하는 방법은 무엇입니까?

redirect_to post_path(@post, :params => params) 

레일 이후 경로 도우미는 (내가 읽은 어떤에서) 직접 PARAMS 해시를 설정하는 것을 허용하지 않습니다.

이 몇 가지 문제를 제기 할 수있었습니다 :

당신이 전달 될 수 있기 때문에
redirect_to post_path(@post, params) 

: 컨트롤러 : 동일한 컨트롤러로 이동하고 행동 할 행동의 매개 변수를뿐만 아니라, 당신은에서왔다. 이것은 종종 당신이 원하는 것이 아닙니다.

이 작동하지만, 그것은 많은 코드가 모든 (제외 컨트롤러 : 행동과) PARAMS을 설정하는 데 걸리는에서 복잡하기 때문에, 불충분 기존 PARAMS에 :

redirect_to post_path(@post, {:someparameter => params[:someparameter]}) 

그래서, 가장 간단하고 쉬운 방법은 무엇입니까?

답변

9

당신 수 쉽게 앞으로이 같은 제외 할 사람을 제외한 모든 매개 변수 : 같은 _method 및 기타 매개 변수 : ID

redirect_to post_path(@post, params.to_hash.except(:controller, :action)) 

하지만 그건 아마 여전히 통해 보내는 당신을 떠날 것이다 : authenticity_token, 중첩 된 리소스가있는 경우 원하지 않을 수 있습니다. 많은없이, 당신은 단순히 당신이 (이 나머지 부분을 제외)을 통해 보낼 PARAMS을 지정할 수 있습니다

redirect_to post_path(@post, params.to_hash.slice(:someparameter, :anotheparameteryouwant)) 

:

따라서, 가장 쉬운 방법은, 대부분의 목적을위한 것 같다 암호.

+0

이 기사를 올바르게 읽으면 레일 4 (http://tenderlovemaking.com/2014/06/02/yagni-methods-are-killing-me.html)에서 메모리 누수가 발생할 수 있다고 생각합니다. ''params'''에서'''to_hash'''로 해결할 수있을 것 같습니다. –

+0

고마워, 그게 내가 깨닫지 못했던 매우 유효한 문제 야! 지금 코드를 업데이트했습니다. – Magne

+0

실제로'.slice'는'.delete'처럼 params 해시를 변경하지 않는다는 것을 알았습니다. 그냥 새로운 해시를 반환합니다. 그래서 안전해야합니다. 내 대답에는'to_hash'를 포함시킬 것입니다. – Magne

관련 문제