Ruby on rails 一旦启用操作缓存,format.js就不会操作dom
注意:我在这里展示了我正在做的一个逻辑 我在做什么: 考虑一下基本的索引操作,我们在其中列出产品并使用分页。现在使用remote true选项,我启用了基于ajax的分页。到目前为止,一切都很顺利。看看示例代码 产品控制员: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
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');
});