2012-09-13 3 views
0

게시 및 댓글 모델이 있습니다. 코멘트는 포스트에 속하며 루트의 포스트 아래에 중첩됩니다. 의견은 게시물 # show에서 게시됩니다. 내 경로는 다음과 같다 : 사용자가 검증에 실패 의견을 제출중첩 된 리소스를 사용할 때의 라우팅 오류

resources :posts do 
    resources :comments, only: [:create, :edit, :update, :destroy] 
    end 

경우, URL은 다음과 같이 표시됩니다

app.com/posts/:id/comments 

을 어떤 이유로, 사용자의 입력 공격하기로 결정하는 경우 주소 표시 줄에 라우팅 오류가 있습니다.

Routing Error 
No route matches [GET] "/posts/21/comments" 
Try running rake routes for more information on available routes. 

이것은 어떤 이상한 것입니다. 왜 오류가 발생하는지 이해하지만 사용성 측면에서는 좋지 않은 것처럼 보입니다. 이런 일이 발생하지 않도록하는 방법이 있습니까?

친숙한 리디렉션을 수행 할 때 이것은 더 큰 문제가됩니다. 친숙한 리디렉션이 발생하면 Rails는 GET 요청을 사용하여 동일한 URL로 리디렉션하여 다시 라우팅 오류를 발생시킵니다.

답변

1

나는이 경우에 대한 경로를 만들고 응용 프로그램에 적합한 곳으로 리디렉션하는 것이 가장 좋은 방법이라고 생각합니다. 다음과 같은 메시지가 표시됩니다.

match "/posts/:id/comments" => redirect {|params| "/posts/#{params[:id]}" } 

해당 라우팅 오류 대신 사용자가 게시 페이지로 리디렉션됩니다.

+0

흥미는 PARAMS을 보존 할 수있는 방법은 POST 요청의 경우, 또는 사용자의 제출에 대한 어떤이 게시물 제출을 계속 하시겠습니까? – Mohamad

+0

매개 변수를 쿠키에 저장할 수 있습니다. 또한 저장된 데이터를 검색해야하는지 또는 제출을 다시 시도할지 여부를 제어해야합니다. –

0

그러나 다른 해결책은 게시물의 중첩 된 속성을 통해 설명을 추가하는 것일 수 있습니다.

1

당신의 경로가

resources :posts do 
    resources :comments, only: [:create, :edit, :update, :destroy] 
end 

다음 편집에 대한 URL이

app.com/posts/:post_id/comments/:id/edit 

곳이 될 것 인 경우 : ID가 주석이다. 유효성 검사가 실패하면이 URL로 다시 리디렉션해야합니다.

def update 
    @post = Post.find(params[:post_id]) 
    @comment = @post.comments.find(params[:id]) 

    if @comment.update_attributes(params[:comment]) 
    redirect_to(edit_post_path(@post)) 
    else 
    redirect_to(edit_post_comment_path(@post, @comment), :notice => "update failed") 
    end 
end 

더 나은, 올바른 편집 URL에 이미 있기 때문에,

... 
    else 
    flash[:error] = "Error - could not update comment" 
    render :action => "edit" 
    end 
+0

+1 감사합니다. 이것을 시험해보고 그것이 어떻게 저에게 효과가 있는지보십시오. – Mohamad

+0

예를 들어'update' 메소드의 예가 명확해야합니다. 이것이 포스트 컨트롤러 또는 코멘트 컨트롤러에 있다는 것을 의미합니까? – Mohamad

+0

클래스 이름을 포함해야합니다. 댓글 컨트롤러입니다. –