После удаления записи в Rails 3 обновленное представление не обновляется - PullRequest
1 голос
/ 30 июня 2011

Я имею дело с базовым отношением один-ко-многим, когда я удаляю запись со многих сторон. Модели являются "местах" и "search_terms", где места имеет has_many search_terms. Когда я создаю новую запись, представление обновляется, и новый search_term добавляется в список. Однако при удалении записи search_term представление не обновляется, даже если оно удаляет запись и запускает метод «show» для Place.

Я довольно новичок в рельсах 3, поэтому не могу понять, что здесь происходит ...

Ура, Gearoid.

Редактировать: метод уничтожения контроллера search_terms:

def destroy
    @search_term = SearchTerm.find(params[:id])
    @search_term.destroy

    @place = Place.find(params[:place_id])
    redirect_to place_path(@place)    
end

Метод показа контроллера мест:

def show
    @place = Place.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.xml  { render :xml => @place }
     end
end

1 Ответ

0 голосов
/ 30 июня 2011

Возможно, я вас неправильно понимаю, не могли бы вы опубликовать код вашего контроллера?

Это происходит через ajax? Если нет, можете ли вы перенаправить на Show вместо повторного рендеринга? Это, вероятно, предпочтительный опыт для пользователя в любом случае.

UPDATE

Хорошо, если это происходит через ajax, тогда проблема проста. Ваше действие destroy ожидает только обычного события браузера и выполняет вызов redirect_to. Ajax-вызов не знает, как с этим справиться, и просто сидит там. Вероятно, вы можете увидеть код перенаправления в чем-то вроде Firebug.

Я не очень знаком с jquery-rails (я предпочитаю писать все свои js самостоятельно, потому что я анальный). Вы можете сделать так, чтобы действие destroy возвращало формат js следующим образом:

def destroy
    @search_term = SearchTerm.find(params[:id])
    @search_term.destroy

    @place = Place.find(params[:place_id])
    respond_to do |format|
        format.html { redirect_to place_path(@place) }
        format.js { render :nothing => true }
    end
end

Это даст вызывающему ajax сигнал о том, что он сделал свое дело. Ваш javascript все равно должен будет разумно обрабатывать этот ответ, как, например, удалить элемент из DOM.

...