我无法弄清楚为什么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
答案 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
这有两个重要原因。首先,它会自动为您创建以下资源丰富的路线:
当然,这可以通过提供&#34;罐装&#34;来解决您与show
和new
行为之间的冲突。控制器的路由集。
然而,还有另一个&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