2010-12-09 3 views
7

Использование rails3 и прототип (rails.js)link_to дистанционного => верно не обновление с помощью AJAX

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

/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'); 
    }) 
}); 

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

Любая помощь (кроме использования jQuery) приветствуется!

EDIT: Вот лог-сервер для удаления действия (после того, как я переехал 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 так удаленный строительные работы

[36mПродукция груза (0,0ms) [0m [1mSELECT products. ИЗ products * В @products = Product.all выполняется

Оказываемой продукции/destroy.js.erb в макетах/стандартной Javascript тьфу визуализируются

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

$ (документ) .ready (функция() { $ ("# product_list") HTML ("<% = escape_javascript (Render (: частично => "список"))%>"); });

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

ответ

0

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

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

Вы редактируете файл «app/views/products/destroy.rjs»?

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

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

Является ли это лучше?

+1

Привет, вы можете взглянуть на приведенное выше изменение. Je ajax и js.erb выполняются и отображаются. Может возникнуть проблема с кодом js – 2010-12-10 01:22:08

22

нашел ответ на мой собственный:

/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 thingy в rails3? мне пришлось использовать части кода из 5 различных блогах, форумах и слепков, и смешать их вместе, пока я не нашел правильную комбинацию ... вздыхают

+0

Я также ищу учебник или пример, но не нашел ничего полезного на «официальных» сайтах рельсов. Я дам ваш код попробовать .. – Klaus 2011-03-25 16:27:55

1

на 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")) %>"); 

и я нашел this на ночь.

1

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

/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-запрос, который будет перенаправлен на индекс продуктов, который будет соответствующим образом обновлен.

Смежные вопросы