一旦启用了动作缓存,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中没有任何更新。 您使用$.ajax
和dataType:'script'
的解决方案为我解决了问题,但是,我不喜欢必须将jquery绑定到链接上的点击,这应该默认发生…我能够通过将我的link_to
更改为:使其正常工作:
= link_to "click me", user_action_path(params), remote: true, data:{type: 'script'}
希望这可以帮助!