0

我有一个帖子和评论模型。Comment 属于一个 Post,它嵌套在 Post in routes 下。评论来自 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 回答