在ROR中删除数据库行

时间:2016-02-08 13:46:51

标签: ruby-on-rails

有人可以帮助我,为什么以下两段代码不会产生相同的结果'?

选项1

<%= button_to 'delete', {:controller => "articles", :action => 'destroy', :id => article.id}, 
  :confirm => "Are you sure you want to delete?", :method => :delete %>

选项2

<%= link_to 'delete', {:controller => "articles", :action => 'destroy', :id => article.id}, 
  :confirm => "Are you sure you want to delete?", :method => :delete %>

选项1有效。选项2由于某种原因调用控制器中的Show操作。有趣的是,在Ruby On Rails教程中使用了Option 2,我正在关注....

你可以想象我是ROR的新手。

2 个答案:

答案 0 :(得分:3)

为了link_to使用delete方法,Rails需要unobtrusive scripting adapter for jQuery

  • 确保 Gemfile

    gem 'jquery-rails'

  • 确保app / assets / javascripts / application.js

    //= require jquery
    //= require jquery_ujs

  • 确保你的app / views / layouts / application.html.erb

    <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
    <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>

    head标记内。如果您不打算使用Turbolinks,请移除'data-turbolinks-track' => true部分。

答案 1 :(得分:1)

由于浏览器无法发送本机扩展的HTTP谓词集(DELETE,PUT,PATCH)。 Rails使用Rack::MethodOverride中间件来伪造它。

因此,当您使用_method = DELETE参数执行POST请求时,您的Rails应用收到的请求对象为request.method == 'DELETE'

推荐阅读:

button_to 会创建一个离散表单。因此,您的“按钮”实际上是一个隐藏输入的表单。

<form action="articles/1" method="post">
  <input type="hidden" name="_method" value="DELETE">
  <input type="submit">This is the button you see</button>
</form>

Rails也非常棒,所以你可以这样做:

<%= button_to 'delete', article, 
  confirm: "Are you sure you want to delete?", method: :delete %>

只要你遵循铁路惯例,它就会自己找出路线。

link_to 使用javascript来增强普通<a>元素。

,而不是正常的行为,jQuery ujs驱动程序创建一个类似上面的表单。

link_to出现问题的最常见原因是您的jquery中未包含jquery_ujsapplication.js,或者您遇到脚本错误这阻碍了它的工作。检查浏览器控制台是否有错误。