我有一个帖子和评论模型。注释属于Post,它嵌套在Post中的路径中。评论从帖子#show发布。我的路线看起来像这样:
resources :posts do
resources :comments, only: [:create, :edit, :update, :destroy]
end
如果用户提交的评论未通过验证,则网址将如下所示:
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,再次导致路由错误。
答案 0 :(得分:1)
我认为避免它的最佳方法是为此案例创建一个路由,并重定向到适合您的应用程序的任何地方。如下所示:
match "/posts/:id/comments" => redirect {|params| "/posts/#{params[:id]}" }
而不是该路由错误,用户将被重定向到帖子页。
答案 1 :(得分: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
更好,因为您已经在正确的编辑网址
...
else
flash[:error] = "Error - could not update comment"
render :action => "edit"
end
答案 2 :(得分:0)
不是最好的,但另一个解决方案可能是通过帖子的嵌套属性添加评论。