我的Parent
模型有Children
。如果删除了某个Children
的所有Parent
,我也会自动删除Parent
。
在非AJAX场景中,ChildrenController
我会这样做:
@parent = @child.parent
@child.destroy
if @parent.children.empty?
redirect_to :action => :destroy,
:controller => :parents,
:id => @parent.id
end
但是当请求是XHR时,这是不可能的。重定向导致GET请求。
我能想到用AJAX执行此操作的唯一方法是为响应RJS添加逻辑,使其创建link_to_remote
元素,“单击”它,然后将其删除。看起来很难看。还有更好的方法吗?
澄清
当我使用术语重定向时,我并不是指HTTP重定向。我的意思是,我没有返回与销毁Child
相关联的RJS,而是希望在destroy
上执行Parent
并返回与销毁父级相关联的RJS。
答案 0 :(得分:1)
我会听nathanvda所说的,但你可以通过ruby语法来做(并且你不需要在rjs中使用erb scriptlet):
if @parent.children.empty?
page.redirect_to(url_for :action => :destroy,
:controller => :parents,
:id => @parent.id)
else
.. do your normall stuff here ..
end
答案 1 :(得分:1)
通过重定向销毁父级的更好方法是在after_hook中执行此操作。您不仅不需要告诉用户的浏览器再发出请求,您也不需要在删除子项的代码中随处跟踪,这样您最终就不会有挂父。
class Parent < ActiveRecord::Base
# also worth getting the dependent destroy, so you don't have hanging children
has_many :chilren, :dependent => :destroy
end
class Child < ActiveRecord::Base
after_destroy { parent.destroy if parent.children.empty? }
end
然后您可以处理,但是您更喜欢在发生这种情况时向用户显示的内容,例如将用户重定向到“/ parents”。
答案 2 :(得分:0)
我猜你可以在你的rj中设置window.location.href
,比如
<% if @parent.children.empty? %>
window.location.href='<%= url_for :action => :destroy,
:controller => :parents,
:id => @parent.id %>'
<% else %>
.. do your normall stuff here ..
<% end %>
假设你渲染javascript。不确定它是否完全正确,但希望你明白这一点。
[编辑:添加控制器代码]
为了使其更清晰,您的控制器将如下所示
@parent = @child.parent
@child.destroy
if @parent.children.empty?
render :redirect
end