рельсы: как обновить отношение has_many: через через JQuery? - PullRequest
2 голосов
/ 04 ноября 2008

Извините, если это нудистский вопрос, но я только начинаю с Rails и jQuery. У меня есть следующий сценарий:

У меня есть 3 класса: контакты, компании и contact_company_joins (ccj). Для всех трех классов я создал модели, контроллер и представления. Очевидно, контакты и компании соединяются через ccj (используя has_many: through).

контакты <-> contact_company_joins <-> компании

В представлении «Показать» моего контакта я хочу отобразить таблицу, в которой перечислены все компании, к которым подключен контакт (и некоторую дополнительную информацию о самой компании, например, номер телефона). По мнению моей компании, я хочу сделать то же самое, но на этот раз с подробностями о сотрудниках (контактах). Каждая строка таблицы имеет типичную ссылку «удалить» в конце, функцию которой я теперь подключил к одной из моих функций jQuery:

$('.edit_contact_join_delete').livequery('click', function() {
    var $deleteButton = $(this);
    var answer = confirm("Sure?");
    var dataloc = "&_method=delete";
    if (answer) {
     $.ajax({
          type : "POST",
          url  : this.href,
          data : dataloc,
          success: function(result) {
          }
        });
    }
    return false;
  });

В обоих представлениях (контакт и компания) действие удаления приводит меня к функции уничтожения контроллера ccj. Теперь я хочу обновить или повторно отобразить таблицу отдельного сайта (контакт или компанию), который вызывает функцию удаления, но ТОЛЬКО часть таблицы. Я думаю, я должен реализовать это в функции «успех» выше? Но опять же, даже если я верну что-то из контроллера ccj (визуализированный частичный?) ... это было бы одинаково как для контакта, так и для компании, верно? Как я могу убедиться, что после моего вызова Ajax для уничтожения объекта ccj я получу свежий объект DOM для представления моего контакта (который будет новой таблицей компании), но также получу новую таблицу контактов, когда я выполняю вызов Ajax из вид моей компании?

Надеюсь, все это имеет смысл: -)

С уважением,

Себастьян

1 Ответ

2 голосов
/ 05 ноября 2008

Все, что вам нужно, чтобы действие удаления вернуло успех или неудачу (даже просто true или false), тогда ваш javascript может обработать любой ответ.

Если произошел сбой, верните сообщение о том, что, если успех и связь удалены, вы можете найти родительский элемент

ссылки удаления, которую вы щелкнули, и затемнуть строку, в конечном итоге удалив ее со страницы. Например (учитывая, что ваш контроллер возвращает true, если удаление прошло успешно, иначе false):
$('.edit_contact_join_delete').livequery('click', function() {
    var $deleteButton = $(this);
    var answer = confirm("Sure?");
    var dataloc = "&_method=delete";
    if (answer) {
     $.ajax({
          type : "POST",
          url  : this.href,
          data : dataloc,
          success: function(result) {
            if (result) {
              // handle successful delete
              $deleteButton.parent('tr').fadeOut().remove()
            } else {
              // handle failed delete
              alert('Delete failed');
            }
          } 
        });
    }
    return false;   
  });
...