有人可以帮助我,为什么以下两段代码不会产生相同的结果'?
选项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的新手。
答案 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>
元素。
link_to
出现问题的最常见原因是您的jquery
中未包含jquery_ujs
和application.js
,或者您遇到脚本错误这阻碍了它的工作。检查浏览器控制台是否有错误。