Ruby on rails 一旦启用操作缓存,format.js就不会操作dom

Ruby on rails 一旦启用操作缓存,format.js就不会操作dom,ruby-on-rails,ajax,caching,action-caching,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

注意:我在这里展示了我正在做的一个逻辑

我在做什么:

考虑一下基本的索引操作,我们在其中列出产品并使用分页。现在使用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
 caches_action :index, :cache_path => Proc.new { |c| c.params }
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>
有什么建议吗

更新:

问题是jquery代码没有执行。毫无疑问

我发现了问题所在。jQuery实际上在传入的脚本周围加了一个字符串,以便浏览器对传入的代码进行求值。但是缓存机制只是将代码保存为文本,当一个重新请求时,它会将代码返回为文本,但不会对其求值。因此,需要显式地评估代码


但是如何解决这个问题呢???

经过一些尝试和错误,我想我有一个解决办法

页面链接

而不是

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

使用

因此,应用服务器创建的响应将作为javascript运行

控制器

接下来,将
caches\u操作
行更改为

caches_action :index, cache_path: proc { |c| c.params.except(:_).merge(format: request.format) }
因为ajax为某种时间戳附加了一个
参数


希望这能起作用:)

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

另一个答案是代码显式使用了
jQuery.ajax
,但与远程功能相比,它们的代码的唯一区别在于它们指定了显式的
数据类型。不过,您实际上可以使用
remote:true
来实现这一点

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

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

编辑:另外,我在这里更深入地介绍了数据类型属性以及它如何与Rails一起工作:

我也遇到了同样的问题,但在我的3.0.3应用程序:remote=>true中,我添加了:'data-type'=>:script,并且工作正常


然而,在我的例子中,当用ajax加载列表时,我没有看到任何改进。

我想我找到了解决这个问题的方法。我有一个控制器,它为一个使用format.js通过ajax获取一些数据的操作缓存了一个
动作
,但它不是现成的

我发现,尽管请求被传输到服务器,并且服务器正确地解析了请求并“呈现”了
index.js.erb
模板,但DOM中没有任何更新。您使用
$.ajax
数据类型:'script'
的解决方案为我解决了这个问题,但是,我不喜欢使用jquery绑定到链接上的单击,这在默认情况下应该发生。。。通过将我的
链接更改为
,我可以使它正常工作:

=链接到“单击我”,用户操作路径(参数),远程:true,数据:{type:'script'}


希望这有帮助

请尝试
caches\u action:index,:cache\u path=>Proc.new{{{c | c.params.merge(format:request.format.to\u s)}
是否可以检查caches\u action是否也缓存渲染的部分?打开浏览器控制台并检查收到的响应。在这种情况下,您的问题不会是它不更新DOM,而是使用相同的分部更新它,因此结果相同。@mathieugagne New分部正在渲染,但它不更新DOM。看看这篇文章。我反复检查javascript中没有问题,这不是我的意思。我的意思是,可能正在缓存index.js.erb呈现的部分内容。所以它不会抛出任何错误,只是再次渲染相同的部分,因此看起来它不会更新。不,它正在更改。。我检查了那东西……它坏了:(请查看更新的部分。我认为这是有意义的。请记住,在添加此代码之前,您需要清除缓存。我已经在一个示例应用程序上测试了此代码,我可以确保它正常工作。此外,我正在使用remote=>true。我正在开发一款即将推出的大型产品。嗯……让我在单独的测试应用程序上尝试一下。不要使用
remote:true
。让ajax处理您的链接,而不是依赖
remote:true
。顺便说一句,我忘记了js中有一个
返回false
。@javi问题用这个| c | c.params解决了。除了(:|)我也用过,但是如果我没有把数据类型=>脚本放在不起作用,响应将不会加载。
caches_action :index, cache_path: proc { |c| c.params.except(:_).merge(format: request.format) }
$(function(){
   $('.pagination a').attr('data-remote', 'true').attr('data-type', 'script');
});