为什么我的RoR破坏链接不起作用?

时间:2012-12-29 20:35:26

标签: ruby-on-rails scaffolding destroy

有一个问题困扰我很长一段时间,现在与Ruby on Rails应用程序有关。我在3个不同的环境中测试了完全相同的工作流程,但没有一个我可以让“破坏”链接工作!

使用此设置:

  • RVM 1.17.4
  • Ruby 1.9.3p327
  • Rails 3.2.9

然后,按字面意思执行这些命令:

$ rails new foo
$ cd foo/
$ rails g scaffold bar title:string
$ rake db:migrate

它生成了这个控制器:

  # DELETE /bars/1
  # DELETE /bars/1.json
  def destroy
    @bar = Bar.find(params[:id])
    @bar.destroy

    respond_to do |format|
      format.html { redirect_to bars_url }
      format.json { head :no_content }
    end
  end

这是视图中的销毁线:

<%= link_to 'Destroy', bar, method: :delete, data: { confirm: 'Are you sure?' } %>

这是最后一页中的代码:

<a href="/bars/1" data-confirm="Are you sure?" data-method="delete" rel="nofollow">Destroy</a>

在布局中我有这些:

  <%= stylesheet_link_tag    "application", :media => "all" %>
  <%= javascript_include_tag "application" %>
  <%= csrf_meta_tags %>

在application.js中我有这些:

//= require jquery
//= require jquery_ujs
//= require_tree .

这些是html输出中的行:

<script src="/assets/jquery.js?body=1" type="text/javascript"></script>
<script src="/assets/jquery_ujs.js?body=1" type="text/javascript"></script>
<script src="/assets/bars.js?body=1" type="text/javascript"></script>
<script src="/assets/application.js?body=1" type="text/javascript"></script>

这些是路线:

    bars GET    /bars(.:format)          bars#index
         POST   /bars(.:format)          bars#create
 new_bar GET    /bars/new(.:format)      bars#new
edit_bar GET    /bars/:id/edit(.:format) bars#edit
     bar GET    /bars/:id(.:format)      bars#show
         PUT    /bars/:id(.:format)      bars#update
         DELETE /bars/:id(.:format)      bars#destroy

有人得出同样的结果吗?为什么不起作用?

我在互联网上找到的解决方法是建议没有正确加载javascript,有时建议将操作从DELETE更改为GET。有人建议更改按钮的链接。无论如何,确认永远不会出现,重写所有视图中的所有销毁操作真的很烦人。

2 个答案:

答案 0 :(得分:1)

鉴于html,应该没有问题。因此,这可能是客户端问题,而不是服务器端问题。

正如你所说......

  

我在互联网上找到的解决方法是建议javascript没有正确加载......

  1. 你可能有一个没有javascript支持的浏览器,否则你已经禁用了javascript。

    您在哪些浏览器中测试过这个?尝试使用Firefox,在选项窗口中,确保选中内容标签启用javascript

  2. 或者,在浏览器中转到/assets/jquery.js?body=1/assets/jquery_ujs.js?body=1,以确保javascript框架文件存在。如果没有,您需要将这些添加到您的资产目录,如果您在生产环境中运行,可能需要运行rake assets:precompile

答案 1 :(得分:0)

如果启用了JavaScript并且您确定 destroy 操作必须正常,但是链接没有发送正确的HTTP_METHOD = DELETE,并且路由设置正确,则尝试更改DOCTYPE < /强>:

<!DOCTYPE html>