使用rails3和prototype(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');
})
});
但它没有被执行(这可能不是原型的有效代码)而且我不知道要放入什么代码以便我的列表在销毁产品后得到更新
非常感谢任何帮助(“使用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处理#destroy作为JS ,以便远程链接工作
[36mProduct Load(0.0ms)[0m [1mSELECT products
。 FROM products
*执行@products = Product.all
在布局/标准中渲染产品/ destroy.js.erb呈现javascript fie
所以现在我猜这是javascript代码的问题:
$(document).ready(function(){ $(“#product_list”)。html(“&lt;%= escape_javascript(render(:partial =&gt;”list“))%&gt;”); });
原型是否支持这种代码?我不使用jQuery ......
答案 0 :(得分:23)
自己找到答案:
<强> /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")) %>");
为什么在rails3中没有关于ajax thingy的教程,代码示例或任何明确的内容? 我不得不使用来自5个不同博客,论坛和演员的代码部分,并将它们混合在一起,直到我找到合适的组合......叹息
答案 1 :(得分: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到了晚上。
答案 2 :(得分: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()
只要索引中的product元素使用dom_id之类的东西,这里就是一个例子:
<ul id="products">
<% @products.each do |product|
<li id=<%= dom_id product %>>...</li>
<% end %>
</ul>
这样,你的销毁操作只会破坏目标产品,如果客户端没有JS,它会回退HTML请求,该请求将重定向到将相应更新的产品索引。
答案 3 :(得分:0)
点击删除链接后,您确定请求是作为JS处理的吗? 检查日志。
您的文件“app / views / products / destroy.rjs”是否已呈现?
在rails3中不再存在Rjs。新名称是UJS。
尝试将文件重命名为destroy.js. {haml or erb}
它更好吗?