2013-06-27 4 views
17

모델을 누락 처리 : 게시물 및 사용자레일 4 개 강 매개 변수 - 모델에 Params 해시

포스트 belongs_to : 사용자
사용자 has_many : 게시물

간단한

.

몇 명의 사용자가 있다고 가정하면 Google은 게시물의 수정 페이지를 방문합니다.

<%= form_for @post do |f| %> 

...

<% User.all.each do |user| %> 
    <div><%= f.radio_button "user_id", user.id %></div> 
<% end %> 

...

포스트의 컨트롤러는 레일 4 개 강한 매개 변수를 활용합니다.

params.require(:post).permit(:user_id) 

편집 게시 양식에는 라디오 버튼이 필드로만 있다고 가정합니다.

문제점 : ActionController :: ParameterMissing 예외가 발생합니다. param을 찾을 수 없음 : post

Post params 해시가 생성 된 이유는 위에서 언급 한 예외를 발생시킵니다. 예를 들어 빈 텍스트 필드와 달리 빈 라디오 버튼은 모델의 매개 변수 해시가 생성되도록 트리거하지 않습니다.

게시물 모델에서 user_id가 유효해야한다면 어떻게해야합니까? 틀림없이 포스트를 저장할 수없는 이유와 함께 뷰를 다시 렌더링하려고합니다.

질문 : 레일스 컨벤션을 고수하면서이 상황을 처리하는 우아한 방법은 무엇입니까?

UPDATE : 더 이것에 대해 브레인 스토밍

, 나는이 문제를 다른 때에는 많은 아마 거기에 확신 해요; 반드시 라디오 버튼에 해당하는 것은 아닙니다.

+0

나는 더 이상한 문제가 있습니다 ...모델 해시에 대해 동일한 매개 변수가 없지만 사용자의 필드 중 두 개가있는 form_for @user는 테스트 중입니다. 내 URL이 사용자 이름을 사용하여 발생하고 나는 그것이 ID 또는 뭔가가 누락되었다고 생각합니다. 그러나 나는 같은 일을하는 나의 프로젝트의 다른 부분을 가지고있다. 유일한 차이점은 scaffold보다는 처음부터이 양식을 만든 것입니다 ... – dtc

답변

28

나는 비슷한 문제가있어이 답변 중 많은 부분이 마음에 들지 않았습니다. 레일 문서 (http://guides.rubyonrails.org/action_controller_overview.html#more-examples)에서 나는 다음과 같은 솔루션을 참조하십시오

params.fetch(:blog, {}).permit(:title, :author) 

효과적으로 당신의 기본을 공급을 {}, 충분히 (적어도 내 상황에 대한) 작동하도록 보인다.

코드에 적용, 당신은 할 것 :

params.fetch(:post, {}).permit(:user_id) 

을 나는이 합리적으로 깨끗하고, 내 코드에서 작동하는 것 같다 생각합니다.

+1

굉장! 이것이 제가 찾고 있던 해결책이었습니다. – Ben

+0

PaulL 고맙습니다. 니가 내 목숨을 구했어. 벤의 솔루션을 사용해 보았지만 다음과 같은 오류가 발생합니다. 특성을 할당 할 때 해시를 인수로 전달해야합니다. – cyonder

4

이것은 내 즉각적인 해결책이었습니다 ... 포스트 컨트롤러에 분명히 있고 어쨌든 필요로하는 경우 왜 포스트 매개 변수를 확인해야합니까? 매우 직관력이 떨어지는 것 같습니다. 이것이 가장 좋은 방법일까요?

params.require(:post).permit(:user_id) if params[:post] 
+0

그래,이 작품은 작동하지만 왜 이해가 안되는가 –

+2

@ConnorLeech 원래 문제는 params [: post]가 만들어지지 않았기 때문에 작동합니다. if는 strong params 메소드를 실행하기 전에 간단히 검사합니다. params가 전혀 존재하지 않으면 메서드는 단순히 nil을 반환합니다. Nil은 모든 모델 업데이트 방법이 아니더라도 대부분에서 작동하므로 모든 것이 잘 작동합니다. 게시 매개 변수가 존재하지 않는 경우 (강력한 매개 변수의 전체 점 중 하나) 예외가 throw되기 때문에 지원되지 않기 때문에 많이 좋아하지 않습니다. 전혀 일어나지 않는 일은 내가 예상 한 행동을 고려하는 것이 아닙니다. – Ben

+0

매개 변수 [: post] [: user_id]로 계속 진행하려면 컨트롤러에서도 params [: post]를 확인해야합니다. –