ActiveRecord :: RecordNotFound - 无法找到id = new的联系人

时间:2014-09-10 06:06:56

标签: ruby-on-rails ruby activerecord routing

我无法弄清楚为什么ActiveRecord在我的ContactsController中寻找id ='new'!请帮助这是我第一次使用Ruby on Rails。我的所有其他路线都可以使用get "contacts/new"路线。我不知道这是怎么回事,但当我点击我的索引页面中的链接时,show route / page工作正常但是当我尝试创建一个新的联系人时,我的新路由不起作用,它说错误在我的show方法中在控制器的最底部。请帮助,我是使用Rails框架的新手。

的routes.rb

RailsPortfolio::Application.routes.draw do   

get "contacts" => 'contacts#index', :as => "contact_list"

get "contacts/:id" => 'contacts#show', :as => "contact"

get "contacts/new" => 'contacts#new', :as => "contact_new"

get "contacts/:id/edit" => 'contact#edit', :as => "contact_edit"

post "contacts" => 'contacts#create'

put "contacts/:id" => 'contacts#update'

end

contacts_controller.rb

class ContactsController < ApplicationController

  def index
    @contacts = Contact.all
  end

  def new
    @contact = Contact.new
  end

  binding.pry

  def create
    @contact = Contact.new(params[:contact])

    if @contact.save
      redirect_to contact_list_path
    else
     render "new"
    end
 end

  def edit
    @existing_contact = Contact.find(params[:id])
  end

  def update
    @existing_contact = Contact.find(params[:id])

    if @existing_contact.update_attributes(params[:contact])
      redirect_to contact_list_path(@existing_contact.id)
    else
      render "edit"
    end
  end

  def show
    @contact = Contact.find(params[:id])
  end


end

2 个答案:

答案 0 :(得分:2)

显示

简单地说,错误是因为您已在:show之前定义了:new路线:

get "contacts/:id" => 'contacts#show', :as => "contact"
get "contacts/new" => 'contacts#new', :as => "contact_new"

由于show操作旨在捕获结构为contacts/:id的所有路由,因此如果您向contacts/new发送请求,则会将其视为show行动


<强>资源

您需要在路线中使用resources指令:

#config/routes.rb
resources :contacts

这有两个重要原因。首先,它会自动为您创建以下资源丰富的路线:

enter image description here

当然,这可以通过提供&#34;罐装&#34;来解决您与shownew行为之间的冲突。控制器的路由集。

然而,还有另一个&amp;使用此过程的更重要原因 - 对象方向。我写了很多,因为我觉得Rails开发人员很重要--Rails / Ruby是object-orientated

Object Orientation基本上意味着您的整个应用程序(和流程)应围绕您希望包含在应用程序中的各种对象进行设计。没有太多细节,最重要的是你需要确保你正在建立你的路线,控制器和围绕特定对象的模型,这就是resources如此重要的原因

答案 1 :(得分:0)

以下两条路线是冲突。

get "contacts/:id" => 'contacts#show', :as => "contact"

get "contacts/new" => 'contacts#new', :as => "contact_new"

new将被视为:id,与第一条路线匹配。

你最好使用足智多谋的路线,它会更简单。

resources :contacts