一旦启用了动作缓存,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

 

Products

// products partial is just basic html rendering
$(function(){ $('.pagination a').attr('data-remote', 'true') });

index.js.erb的

  jQuery('#products').html(" 'products/products' ) %>"); $('.pagination a').attr('data-remote', 'true'); 

所以有什么问题:

现在我想在此启用动作缓存。 但是index.js.erb文件不是在操纵DOM。 如果我删除了remote-truefunction,那么缓存就可以正常工作了。

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

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

有什么建议?

更新:

问题是jquery代码没有执行。 从这个问题

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

但是如何解决这个问题?

我不知道使用remote: true会出现什么问题。 其他人建议使用.ajax而不是remote: true ,但这正是远程function所做的,所以应该没有任何区别。

另一个答案是显式使用jQuery.ajax代码,但与远程function相比,他们的代码中唯一的区别是他们指定了一个显式的dataType 。 你可以用remote: true实际做到这一点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-键入与- jquery的/

经过一些试验和错误,我想我有一个解决方法。

页面链接

代替

$(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

希望这工作:)

我一直有同样的问题,但在我的3.0.3应用程序上:remote => true我添加了:’data-type’=>:script并且工作正常。

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

我想我找到了解决这个问题的方法。 我有一个控制器,它有一个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'}

希望这可以帮助!