当我想在用户尝试访问我的应用中的blogs/new
网址时将用户重定向到root_url时出现了一个奇怪的错误。
我的路线是
resources :blogs, only: [:index, :show] do
resources :comments, only: [:create]
end
namespace :admin do
resources :blogs
resources :users, only: [:index, :show]
resources :comments, only: [:create, :new, :destroy]
end
我的非管理员博客控制器看起来像这样:
class BlogsController < ApplicationController
before_action :set_blog, only: [:show]
def show
unless @blog
redirect_to blogs_path
flash[:notice] = "You are not authorized to create a post."
end
end
def index
@blogs = Blog.all
end
private
def set_blog
@blog = Blog.find(params[:id])
end
end
我收到错误Couldn't find Blog with 'id'=new
。
答案 0 :(得分:0)
在rails中,路由的优先级从上到下。这意味着,当您尝试点击/blogs/new
时,该路线会与您show
顶部定义的blogs
routes.rb
行动相匹配。
blogs/new
与映射到/blogs/:id
操作的blogs#show
匹配。
在set_blog
方法中,params[:id]
为new
,由于没有ID为new
的记录,因此您收到了奇怪的错误。
如何解决这个问题?更改路线的优先级。
将以下块移到admin
命名空间路由下方。
namespace :admin do
resources :blogs
resources :users, only: [:index, :show]
resources :comments, only: [:create, :new, :destroy]
end
resources :blogs, only: [:index, :show] do
resources :comments, only: [:create]
end
顺便提一下,您的问题是要避免非管理员用户访问blogs#new
。如果是这种情况,您应该尝试点击/admin/blogs/new
而不是/blogs/new
。
如果你这样做了,你就不会在第一时间得到错误。但是,仍然很了解铁路中路线的优先级。
希望这有帮助!