0

私は投稿とコメントのモデルを持っています。コメントは投稿に属し、ルートの投稿の下にネストされています。コメントは Posts#show から投稿されます。私のルートは次のようになります。

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

ユーザーが検証に失敗したコメントを送信した場合、URL は次のようになります。

app.com/posts/:id/comments

何らかの理由で、ユーザーがアドレス バーで Enter キーを押すことにした場合、ルーティング エラーが発生します。

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

これは何となく奇妙に思えます。エラーが発生する理由は理解できますが、使いやすさを考えるとそうではないようです。これを防ぐ方法はありますか?

これは、友好的なリダイレクトを行うときに大きな問題になります。フレンドリー リダイレクトが発生すると、Rails は GET リクエストを使用して同じ URL にリダイレクトするため、ルーティング エラーが再び発生します。

4

3 に答える 3

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
于 2012-09-13T20:15:21.033 に答える
1

これを回避する最善の方法は、この場合のルートを作成し、アプリケーションにとって意味のある場所にリダイレクトすることだと思います。次のようなもの:

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

そのルーティング エラーの代わりに、ユーザーは投稿ページにリダイレクトされます。

于 2012-09-13T19:48:33.410 に答える
0

最善ではありませんが、投稿のネストされた属性を介してコメントを追加することもできます。

于 2012-09-13T19:53:23.163 に答える