注意:我在这里提出了一个逻辑。
我在做什么:
考虑我们列出产品和分页的基本索引操作。现在使用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只是将代码保存为文本,当重新请求时,它将代码作为文本返回但不对其进行评估。因此,需要明确地评估代码
但如何解决这个问题??
答案 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中没有任何更新。使用$.ajax
和dataType:'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列表加载时的改进。