一旦启用了动作缓存,format.js就不会操作dom

时间:2012-11-29 22:00:34

标签: ruby-on-rails ajax caching action-caching

注意:我在这里提出了一个逻辑。

我在做什么:

考虑我们列出产品和分页的基本索引操作。现在使用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。如果我删除了remote-true功能,那么缓存就可以正常工作了。

对于动作缓存,我在控制器的顶部添加了这一行:

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

有什么建议吗?

更新

问题是jquery代码没有执行。来自this问题

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

但如何解决这个问题??

4 个答案:

答案 0 :(得分: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为某种时间戳添加_参数

希望这有效:)

答案 1 :(得分: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/

答案 2 :(得分:1)

我想我找到了解决这个问题的方法。我有一个控制器,caches_action用于一个动作,它使用format.js通过ajax获取一些数据,而且它没有开箱即用。

我发现,尽管请求被传输到服务器,并且服务器正确地解析了请求并且&#34;呈现&#34; index.js.erb模板,DOM中没有任何更新。使用$.ajaxdataType:'script'的解决方案为我解决了问题,但是,我不想让jquery绑定到链接上的点击,这应该默认发生...通过将link_to更改为此内容,我能够使其正常工作:

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

希望这有帮助!

答案 3 :(得分:0)

我遇到了同样的问题,但在我的3.0.3应用程序中:remote =&gt;我添加了:'data-type'=&gt;:脚本并且工作正常。

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