Rails,def destroy,没有响应destroy.js.erb
这是我的方法:
# DELETE /Groups/1
# DELETE /Groups/1.xml
def destroy
@group = Group.find(params[:id])
@group.destroy
respond_to do |format|
format.js
end
end
在视图中我有:
<a href="/groups/122" data-confirm="Are you sure?" data-method="delete" rel="nofollow" >Delete</a>
但是在删除时,日志会显示:
取值
tarted POST "/groups/128" for 127.0.0.1 at Fri Apr 22 22:21:31 -0700 2011
Processing by GroupsController#destroy as HTML
Parameters: {"authenticity_token"=>"J+A2DN87qoigNxw97oK6NWqPQvXt7KAwLMAM7Er/eWM=", "id"=>"128"}
.....
Completed 406 Not Acceptable in 372ms
永远不会调用destory.js.erb。有什么想法吗?感谢
答案 0 :(得分:5)
首先,
<a href="/groups/122" data-confirm="Are you sure?" data-method="delete" rel="nofollow" >Delete</a>
此链接不是远程的,您可以在您提供的日志中看到它:
Processing by GroupsController#destroy as HTML
使您的链接提交ajax请求add:remote =&gt;是的(和你已经拥有的一样:confirm =&gt;'你确定吗?'和:method =&gt;:destroy)
第二,你应该在用javascript响应时禁用布局渲染。
因此,您的行动可能如下:
respond_to do |format|
format.js { render :template => 'groups/destroy.js.erb', :layout => false }
end
为了方便起见,我已将此添加到我的控制器中:
layout Proc.new { |controller| controller.request.xhr?? false : 'application' }
如果请求是xhr类型,则不会呈现布局。然后你可以像现在这样离开你的行动,它应该可以工作
答案 1 :(得分:0)
您是否安装了 jquery-rails gem ?,还要验证您是否具有:
的 csrf_meta_tag 强>
javascript_include_tag:默认
在你的布局中
P.S似乎是你的控制器无法响应 js 格式,你也可以尝试添加
respond_to:html,:你控制器类中的js如下:
class MyController < ActionController
respond_to :html, :js
....
def destroy
...
end
end
如果有帮助,请告诉我
答案 2 :(得分:0)
检查native rails helper的输出是否返回它返回的链接
<a onclick="if (confirm('Are you sure?'))
{ var f = document.createElement('form');
f.style.display = 'none';
this.parentNode.appendChild(f);
f.method = 'POST';
f.action = this.href;
var m = document.createElement('input');
m.setAttribute('type', 'hidden');
m.setAttribute('name', '_method');
m.setAttribute('value', 'delete');
f.appendChild(m);
var s = document.createElement('input');
s.setAttribute('type', 'hidden');
s.setAttribute('name', 'authenticity_token');
s.setAttribute('value', 'GAsTX1/XJAAoXBxJuE28EPW9jraQd5N39WeeuvakLWA=');
f.appendChild(s);
f.submit(); };
return false;"
href="/categories/1">Destroy</a>