link_to remote => true не обновляется с помощью ajax - PullRequest
7 голосов
/ 09 декабря 2010

Использование rails3 и прототипа (rails.js)

У меня есть простой список продуктов с ссылками редактирования и удаления в виде изображений.При удалении товара список не обновляется.Обновление страницы показывает, что продукт действительно был удален.

/ app / views / products / list.rhtml

<div id="product_list">
  <%= render :partial => 'list'  %> 
</div>

/ app / views / products / _list.rhtml

<%= link_to image_tag("delete.png"), { :controller => 'products', :action => 'destroy', :id => product }, :method => :delete, :confirm => "Are you sure?", :remote => true %>

/ app / controllers / products.rb

  def destroy
    Product.find(params[:id]).destroy
    @products = Product.all
  end

/ app / views / products / destroy.rjs (не уверен, что с этим делать ...)

$(document).ready(function() {
    $("#product_list").html("<%= escape_javascript( render(:partial => "list") ) %>");
});

Так что удаленная ссылка, кажется, работает нормально.Я не уверен, как использовать обратный вызов ajax для обновления # product_list

Я пытался поместить в заголовок страницы следующее:

$(document).ready(function(){
  $('#product_list').bind("ajax:success", function(evt, data, status, xhr){
      alert('hello');
    })
});

Но это не выполняется (это, вероятно,недопустимый код для прототипа), и я не знаю, какой код поместить внутрь, чтобы мой список обновлялся после уничтожения продукта

Любая помощь (кроме «use jQuery») очень ценится!

РЕДАКТИРОВАТЬ : Вот журнал сервера для действия удаления (после того, как я переместил вышеупомянутый javascript в destroy.js.erb)

Started POST "/products/destroy/3" for 127.0.0.1 at .....
Processing by ProductsController#destroy as JS
Parameters: {"_"=>"", "id"=>"3"}
[1m[36mProduct Load (0.0ms)[0m  [1mSELECT `products`.* FROM `products` WHERE (`products`.`id` = 3) LIMIT 1[0m
  [1m[35mSQL (0.0ms)[0m  BEGIN
  [1m[36mSQL (0.0ms)[0m  [1mDELETE FROM `products` WHERE (`products`.`id` = 3)[0m
  [1m[35mSQL (78.1ms)[0m  COMMIT
  [1m[36mProduct Load (0.0ms)[0m  [1mSELECT `products`.* FROM `products`[0m
Rendered products/destroy.js.erb within layouts/standard (31.2ms)
Completed 200 OK in 312ms (Views: 62.5ms | ActiveRecord: 78.1ms)

ОбработкаProductsController # уничтожить как JS , чтобы удаленная связь работала

[36 м. Загрузка продукта (0,0 мс) [0 м [1 мSELECT products. ОТ products* @products = Product.all выполняется

Рендеринг products / destroy.js.erb в макетах / стандарт * рендеринг javascript fie

Так что теперь я думаю, что это проблема с кодом javascript:

$ (документ) .ready (function () {$ ("# product_list"). Html ("<% = escape_javascript (render (: частичный =>" список "))%>");});

Этот тип кода поддерживается прототипом?Я не использую jQuery ...

Ответы [ 4 ]

23 голосов
/ 10 декабря 2010

Нашел ответ самостоятельно:

/ app / controllers / products.rb

  def destroy
    Product.find(params[:id]).destroy
    @products = Product.all
    respond_to do |format|
        format.js { render :layout=>false }
    end
  end

/ app / views / products / destroy.js.erb

$("product_list").update("<%= escape_javascript(render(:partial => "list")) %>");

Почему нет НИКАКОГО учебного пособия, примера кода или чего-либо ясного в отношении Ajax в rails3?Мне пришлось использовать части кода из 5 разных блогов, форумов и кастов, и смешивать их все вместе, пока я не найду правильную комбинацию ... вздох

1 голос
/ 04 января 2013

Я думаю, что ваше действие уничтожения делает слишком много, так как уничтожает продукт и перечисляет все продукты.Вы можете сделать что-то вроде:

/ app / controllers / products.rb

class ProductsController < ApplicationController
  respond_to :html, :js

  def destroy
    @product_id = params[:id]
    Product.find(@product_id).destroy
    respond_with do |format|
      format.html { redirect_to posts_path }
    end
  end
end

/ app / views / products / destroy.js.erb

$("#product_<%= @product_id %>").remove()

Пока ваш элемент продукта в индексе использует что-то вроде dom_id, вот пример:

<ul id="products">
  <% @products.each do |product|
    <li id=<%= dom_id product %>>...</li>
  <% end %>
</ul>

Таким образом, ваше действие уничтожения уничтожит только предполагаемый продукти если у клиента нет JS, он возвращается к HTML-запросу, который будет перенаправлен на индекс продуктов, который будет соответствующим образом обновлен.

1 голос
/ 24 сентября 2012

в строках repecmps,

просто вставьте :content_type для представления части загруженного контента, например:

format.js { render :layout=>false, :content_type => 'application/javascript' }

с полной частью ответов repecmps:

def destroy
  Product.find(params[:id]).destroy
  @products = Product.all
  respond_to do |format|
      format.js { render :layout=>false, :content_type => 'application/javascript' }
  end
end

/app/views/products/destroy.js.erb:

$("product_list").html("<%= escape_javascript(render(:partial => "list")) %>");

и я нашел это к ночи.

0 голосов
/ 09 декабря 2010

Хм ... Я постараюсь вам помочь.

Вы уверены, что после нажатия на ссылку удаления запрос обрабатывается как JS? Проверьте в журнале.

Ваш файл "app / views / products / destroy.rjs" отображается?

Rjs больше не существует в rails3. Новое имя UJS.

Попробуйте переименовать файл в destroy.js. {Haml или erb}

Это лучше?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...