我有以下表格:
<%= 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 - 它是标准的脚手架。
当我单击该复选框时,成功创建了订阅,但我无法确定如何在未选中时删除订阅。
答案 0 :(得分:0)
这是一个form_for @subscription
,所以它可能会提交create
或update
行为,这些行为不会破坏模型。你可以破解动作或模型,使其在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/
成功POST
,PUT
和DELETE
后的正确重定向是:
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 %>
路线与show
或GET /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