Rails:在XHR中重定向

时间:2010-08-19 11:12:33

标签: ruby-on-rails

我的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。

3 个答案:

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