2012-04-25 130 views
0

我试图简单地创建一个按钮,将从联系人列表中删除联系人。Rails联系人应用程序联系人删除

目前我有以下设置:

联系控制器

def destroy 
@user.contacts.delete(params[:contact]) 
@contact.delete 
end 

查看

<tbody> 
<% @contacts.each do |contact| %> 
    <tr>  
     <td><%= contact.name %></td> 
     <td><%= contact.company %></td> 
     <td><%= contact.email %></td> 
     <td><%= contact.phone %></td> 
     <td><%= contact.mobile %></td> 
     <td><%= button_to 'Delete', contact, :method => :delete %></td> 
    </tr> 
<% end %> 

路线

controller :contact do 
get "newcontact" => "contact#new" 
get "index" => "contact#index" 
delete "delete" => "contact#destroy" 
end 

我看了网上说使用button_to是首选方法,但此刻我收到以下错误:

undefined method `contacts' for nil:NilClass 

这将是巨大的得到任何反馈,可以帮助我解决这个问题。

在此先感谢 汤姆

为寻找最后的答案就这一点,是

def destroy 
    contact = current_user.contacts.find(params[:id]) 
    contact.destroy 
    redirect_to index_path 
    end 

在我的控制器在我看来,以下

<%= button_to 'Delete', contact, :method => :delete %> 

谢谢 Tom

+1

在'ContactsController#delete'其中是@ user'定义的? – 2012-04-25 18:48:32

+0

为什么不在控制器上执行'Contact.delete(params [:id])'? – 2012-04-25 19:05:29

+0

@Jordan @user目前在我的创建'@user = current_user'的定义中定义。 @ismaelga我使用你的方法得到以下错误,你知道我怎么能解决这个问题吗?使用{:handlers => [:erb,:builder,:coffee],:formats => [:html],:locale => [:en,:en]}缺少模板contact/destroy,application/destroy。搜索:*“C:/ Sites/contact/app/views”' – 2012-04-25 21:42:35

回答

1

如果你是布莱恩使用@user你需要设置@user在您的删除方法,否则这将是零 - 因此错误消息

的另一个问题是,在接触的id为params[:id],而不是params[:contact]

我只是做

contact = current_user.contacts.find(params[:id]) 
contact.destroy 

你一定要被删除通过用户的接触,否则人们可以删除其他用户的联系人。这会删除联系人并将其从关联中删除 - 您不需要执行其他任何操作

1

尝试是这样的:

button_to "Delete", { :action => "delete", :id => contact.id}, :method => :delete

+0

您可能还需要指定您的控制器。 – heavysixer 2012-04-25 18:37:50

+0

嘿Heavysixer,谢谢你的建议,但我得到的路由错误'无路由匹配{:行动=>“删除”,:编号=> 11,:控制器=>“联系人”}我更新了我的问题与我联系人控制器的当前路由 - 如何正确定义此路由?谢谢 – 2012-04-25 21:38:09

+0

嘿汤姆,你的控制器的名字是什么? – heavysixer 2012-04-26 16:03:11

1

如果@usercreate只被定义它一定会为调用create - 和我猜你不destroy前右呼吁create请求存在。每个浏览器请求都会创建一个控制器的新实例;像@user这样的实例变量不会在请求之间停留。

要使其工作,你可能只需要这样:

def destroy 
    Contact.delete params[:contact] 
end 

(当你删除联系人会自动从如current_user.contacts删除假设你的关系通常的方式建立)

+0

嘿约旦,我刚刚尝试实施您的解决方案,并得到以下错误'行动'显示'无法找到ContactController' - 显然有些东西是不正确的,因为它链接到的URL是“http:// localhost:3000/contacts/12”。任何想法如何解决这个问题?干杯汤姆 – 2012-04-26 17:28:18

+0

啊,在调用Contact.delete之后,我认为你需要使用'redirect_to'来发送用户希望他们在'destroy'之后去的地方。否则,它默认为'show'(我猜)你刚刚删除的记录。 – 2012-04-26 17:37:02

+0

酷,我刚刚尝试实现这一点,现在我的控制器中有'Contact.delete params [:contact] redirect_to index_path'和'<%= link_to“删除”,contact,:method =>:delete%>'in my查看,但仍得到相同的'无法找到'Action'show'的ContactController错误。我的路由是“删除”delete“=>”contact#destroy“'这个设置有什么问题吗?欢呼汤姆 – 2012-04-26 17:42:29