在Sinatra中删除记录

时间:2018-02-13 12:40:33

标签: ruby activerecord sinatra haml

我在使用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才能获取?任何帮助或文档都会很棒。

谢谢!

3 个答案:

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