Rails: перенаправление в XHR - PullRequest
0 голосов
/ 19 августа 2010

У меня есть 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.Я имею в виду, что вместо возврата RJS, связанной с уничтожением Child, я хочу выполнить destroy на Parent и вернуть RJS, связанный с уничтожением Parent.

Ответы [ 3 ]

1 голос
/ 19 августа 2010

Я бы послушал, что говорит Натанвда, но вы можете сделать это с помощью синтаксиса ruby ​​(и вам не нужны скрипты erb в rjs):

if @parent.children.empty?
  page.redirect_to(url_for :action => :destroy, 
                           :controller => :parents, 
                           :id => @parent.id)
else
  .. do your normall stuff here ..
end
1 голос
/ 19 августа 2010

Лучший подход к уничтожению родителя с помощью перенаправления - сделать это в 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'.

.
0 голосов
/ 19 августа 2010

Я думаю, вы могли бы установить window.location.href в ваших rjs, что-то вроде

<% 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...