Rails错误无法找到带有' id' = new的博客

时间:2016-09-11 19:55:59

标签: ruby-on-rails

当我想在用户尝试访问我的应用中的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

1 个答案:

答案 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

如果你这样做了,你就不会在第一时间得到错误。但是,仍然很了解铁路中路线的优先级。

希望这有帮助!