2012-11-29 31 views
11

注意:我在这里提出了一个逻辑,我在做什么。format.js在操作缓存启用时不会操纵dom

我在做什么:

想想基本指标的行动,我们的上市产品,并与分页。现在使用remote-true选项,我启用了基于Ajax的分页。到目前为止,事情很好。看看示例代码。

产品控制器:

def index 
    @products = Product.paginate(:order =>"name ASC" ,:page => params[:page], :per_page => 14) 
    respond_to do |format| 
    format.html # index.html.erb 
    format.json { render json: @products } 
    format.js 
    end 
end 

Index.html.erb

<h1>Products</h1> 
<div id="products"> 
    <%= render "products/products" %> // products partial is just basic html rendering 
</div> 

<script> 
$(function(){ 
    $('.pagination a').attr('data-remote', 'true') 
}); 
</script> 

index.js.erb的

jQuery('#products').html("<%= escape_javascript (render :partial => 'products/products') %>"); 
    $('.pagination a').attr('data-remote', 'true'); 

所以什么问题:

现在我想对此启用操作缓存。但是index.js.erb文件不处理DOM。如果我删除远程真正的功能,那么事情与缓存工作正常。

对于动作缓存我已经加入这一行的控制器的顶部:

caches_action :index, :cache_path => Proc.new { |c| c.params } 

有什么建议?

更新:

问题是jQuery代码不执行。从this问题

我发现了什么问题。 jQuery实际上将传入的脚本用a包围,以便浏览器评估传入的代码。但缓存机制仅仅将代码保存为文本,并且当重新请求时,它将代码作为文本返回,但不对其进行评估。因此,需要明确评估代码

但是如何解决这个问题?

+0

尝试'caches_action:index,:cache_path => Proc.new {| c | c.params.merge(格式:request.format。to_s)}' – jvnill

+0

你能检查caches_action是否也缓存你渲染的部分?打开浏览器控制台并检查您收到的回复。在这种情况下,你的问题不是它不更新DOM,而是用相同的部分更新它,因此结果相同。 – mathieugagne

+0

所以...你检查了吗? – mathieugagne

回答

3

我不看看使用remote: true应该是什么问题。其他人建议使用.ajax而不是remote: true,但这正是远程功能的作用,所以应该没有任何区别。

其他答案有明确使用jQuery.ajax的代码,但它们的代码与远程功能的唯一区别在于它们指定了明确的dataType。虽然你可以用remote: true来实现。

在您的HTML链接中,您只需指定data-type="script"。或者,根据您发布的JS,你可以这样做:

$(function(){ 
    $('.pagination a').attr('data-remote', 'true').attr('data-type', 'script'); 
}); 

编辑:另外,我写了更深入的有关数据类型的属性,它是如何工作使用Rails这里:http://www.alfajango.com/blog/rails-3-remote-links-and-forms-data-type-with-jquery/

4

经过一些试验和错误,我想我有一个工作。

页面链接

而不是

$(function() { $('.pagination a').attr('data-remote', 'true') });

使用

$(function() { 
    $('.pagination a').click(function() { 
    $.ajax({ 
     url: this.href, 
     dataType: 'script' 
    }); 
    return false; 
    }); 
}); 

所以响应由应用服务器创建将运行如JavaScript

控制器

下一个,你caches_action线改为

caches_action :index, cache_path: proc { |c| c.params.except(:_).merge(format: request.format) } 

因为Ajax追加_ params用于在某种时间戳

希望这个工程:)

+0

它不工作:(请检查更新的部分,我认为这是有道理的.. –

+0

记住,您需要清除您的缓存,然后再添加此代码。我已经在示例应用程序上测试过这一个,我可以保证它正在工作 – jvnill

+0

另外我正在使用remote => true。,并且我处于一个大规模即将推出的产品中.. –

0

我一直有同样的问题,但在我的3.0.3应用程序与:远程=>真我已经添加:'data-type'=>:脚本,并已正常工作。

但是,在我的情况下,我没有看到由ajax列表加载时的改进。

+0

@javi使用此| c |修复的问题c.params.except(:_) –

+0

我也用过,但是如果我不把data-type =>脚本不起作用,响应将不会加载。 –

0

我想我找到了解决这个问题的办法。我有一个控制器,它具有caches_action用于使用format.js通过ajax获取某些数据的操作,并且它不是开箱即用的。

我发现,尽管请求被传输到服务器,并且服务器正确解析请求并“呈现”index.js.erb模板,但DOM中没有更新内容。您的解决方案$.ajaxdataType:'script'解决了我的问题,但是,我不喜欢必须执行jquery绑定到链接上的点击,这应该在默认情况下发生......我可以通过更改我link_to这样:

= link_to "click me", user_action_path(params), remote: true, data:{type: 'script'}

希望这有助于!