【问题标题】:ActiveRecord::RecordNotFound - Couldn't find Contact with id=newActiveRecord::RecordNotFound - 找不到 id=new 的联系人
【发布时间】:2014-09-10 16:38:08
【问题描述】:

我不明白为什么 ActiveRecord 在我的 ContactsController 中寻找 id='new'!请帮助这是我第一次使用 Ruby on Rails 练习。我所有的其他路线都有效,但我的get "contacts/new" 路线。我不确定这是怎么回事,但是,当我单击索引页面中的链接时,显示路线/页面可以正常工作,但是当我尝试创建新联系人时,我的新路线不起作用,并且它说错误出现在我的显示方法中在控制器的最底部。请帮助,我是使用 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

【问题讨论】:

  • resources :contacts 在您的路线中就足够了
  • 在路由文件中,您可以对所有路由使用较短的版本,例如资源:联系人
  • 感谢@nithin,我的导师还没有教我们用于 CRUD 操作的资源指令。不知道为什么,但我以后会记得的。下面的人暂时解决了我的问题。只需要将我的表演路线移到底部即可。
  • @bigREDcode okies,您可以接受解决问题的答案。

标签: ruby-on-rails ruby activerecord routing


【解决方案1】:

显示

简单来说,错误是因为你在:new之前定义了:show路由:

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

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

当然,这将通过为您的控制器提供一组“固定”路由来解决您与 shownew 操作的冲突。

但是,使用此过程还有另一个更重要的原因 - object 方向。我写了很多,因为我认为 Rails 开发人员掌握这一点很重要——Rails / Ruby 是object-orientated

Object Orientation 基本上意味着您的整个应用程序(和流程)应该围绕您想要包含在应用程序中的各种对象 进行设计。无需过多介绍,最重要的是您需要确保围绕特定对象构建路由、控制器和模型,这就是resources 如此重要的原因

【讨论】:

  • 谢谢@Rich,我在之前的问题中看到了使用资源指令作为解决方案,但是由于我的导师尚未将资源指令用于 CRUD 操作,因此我不确定该方法和它实际上更多地破坏了我的代码。这只是我的路线的顺序,就像你说的那样。抱歉,我还不能为你的答案投票!
【解决方案2】:

下面的两条路线是冲突的。

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

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

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

你最好用足智多谋的路线,这样会简单很多。

resources :contacts

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多