Rails,def destroy,没有响应destroy.js.erb,为什么?

时间:2011-04-23 05:24:12

标签: ruby-on-rails ruby-on-rails-3

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。有什么想法吗?感谢

3 个答案:

答案 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>