使用复选框删除rails中的对象?

时间:2011-10-04 09:20:14

标签: ruby-on-rails

我有以下表格:

<%= form_for(@subscription = @task.subscriptions.build(:user_id => subscribers.id)) do |f| %>   
    <%= f.check_box :subscribed, :class => 'submittable' %>
    <%= f.label :subscribed, subscribers.full_name %>
    <%= f.hidden_field :user_id, :value => subscribers.id %> 
    <%= f.hidden_field :task_id, :value => @task.id %>
<% end %>

复选框上的'submittable'类会导致在更新时提交表单(通过jQuery)。

:susbcribed通过模型中的方法返回,返回用户是否订阅 - 无法直接修改。

控制器在这里可用:http://pastebin.com/zZy6KcXz - 它是标准的脚手架。

当我单击该复选框时,成功创建了订阅,但我无法确定如何在未选中时删除订阅。

2 个答案:

答案 0 :(得分:0)

这是一个form_for @subscription,所以它可能会提交createupdate行为,这些行为不会破坏模型。你可以破解动作或模型,使其在create(!)/ update上销毁。可能行动......更新这个黑客的模型给了我heeby-jeebies。

Rails way™到DELETE方法并进入销毁路线是这样的链接:

<%= link_to 'Delete', @model, :confirm=> 'Are you sure?', :method=> :delete %>

请注意IE9。如果您让重定向转到另一个“可删除”,它可能会上链并删除整个数据库。 http://techno-weenie.net/2011/8/19/ie9-deletes-stuff/

成功POSTPUTDELETE后的正确重定向是:

redirect_to path, :status => 303

答案 1 :(得分:0)

cjm,在jimworm的回答中,当你删除时调用控制器的destroy方法(HTTP动词,实际上是一个POST并且有一个_method=DELETE字段已经通过,因为有些浏览器没有不支持DELETE动词。

他说:

<%= link_to 'Delete', @model, :confirm=> 'Are you sure?', :method=> :delete %>

路线与showGET /models/1相同,但代之以使用动词DELETE

DELETE /models/1

实际上是

POST /models/1传递了隐藏字段_method=DELETE,以支持所有浏览器。

正如他所提到的,Rails会自动确定使用form_for时要使用的操作,方法是检查@model是否为new_record?(还有id)或现有的。然后选择

POST /models

create

PUT /models/1

update