我在使用Active Record实现删除路由到Sinatra时遇到了一些麻烦。以下是代码详细信息
路线
delete '/contacts/:id' do
@contact = Contact.find_by_id(params[:id])
if @contact
@contact.destroy
else
halt 404, "Contact not found"
end
查看
%table.u-full-width
%thead
%tr
%th Name
%th Phone Number
%th
%tbody
- @contacts.each do |contact|
%tr
%td= contact.name
%td= contact.phone_number
%td{}
%form{:style => "margin: .75rem auto auto .25rem", :action => "/contacts/#{@contact.id}", :method => "post"}
%input{:name => "_method", :type => "hidden", :value => "DELETE"}/
%input.button#button-delete{:type => "submit", :value => "Delete"}/
堆叠错误
NoMethodError at / contacts undefined method`id'为零:NilClass file:contacts.haml 位置:单例类中的块(2级) 行:55
:我的观点中没有传递ID吗?我是否需要在我的表格中列出contact.id才能获取?任何帮助或文档都会很棒。
谢谢!
答案 0 :(得分:0)
当您尝试呈现表单时,您的错误表示您的本地变量@contact
为nil。
:action => "/contacts/#{@contact.id}"
您在渲染此视图时是否实际将联系对象传递给了上下文?
答案 1 :(得分:0)
问题是你给
@contact.id
中的:action => "/contacts/#{@contact.id}"
不存在。
实际上,您的@contacts
包含所有联系人,contact
是一个联系人。 @contact
为零
只需将其替换为:action => "/contacts/#{contact.id}"
答案 2 :(得分:0)
如果您查看错误消息,则错误与您编写delete
操作的方式无关。您的delete
操作看起来没问题。该错误位于与index
操作对应的视图文件中。
在index
操作中,您可能会执行以下操作:@contacts = Contact.all
,它将实例变量@contacts
设置为联系人集合。
当您在视图中到达- @contacts.each do |contact|
时,您将遍历联系人集合中的每个元素,并在每次运行块时定义名为contact
的局部变量。这是您应该在:action => "/contacts/#{@contact.id}"
而不是@contact
引用的内容。
您正在尝试构建一个指向@contacts
中每个元素的删除操作的表单,但您实际上并未引用联系人本身,因为@contact
是一个实例变量从未设定过。只有在您实际发出路由到@contact
操作的请求后才会设置delete
。