我正在通过入门教程(创建博客)并且link_to Destroy无法正常运行。在终端中,它总是将其解释为#SHOW。
在阅读类似问题时,我了解到删除必须转换为POST以供浏览器解释。这似乎没有发生。
我在Lynda.com Rails课程中使用Destroy也遇到了同样的问题,所以它让我相信它是我开发环境中的东西。我在MacBook Pro Lion上使用Rails 4,Ruby 2.00p274,MySQL,WEBrick作为HTTP服务器。
选择Destroy时终端会话中的:
Started GET "/posts/4" for 127.0.0.1 at 2013-08-09 13:45:20 -0600
Processing by PostsController#show as HTML
Parameters: {"id"=>"4"}
Post Load (0.6ms) SELECT "posts".* FROM "posts" WHERE "posts"."id" = ? LIMIT 1 [["id", "4"]]
Rendered posts/show.html.erb within layouts/application (0.4ms)
Completed 200 OK in 13ms (Views: 8.6ms | ActiveRecord: 0.6ms)
在ports-controller.rb中:
def destroy
@post = Post.find(params[:id])
@post.destroy
redirect_to action: :index
end
在index.html.erb中:
<% @posts.each do |post| %>
<tr>
<td><%= post.title %></td>
<td><%= post.text %></td>
<td><%= link_to 'Show', post %></td>
<td><%= link_to 'Edit', edit_post_path(post) %></td>
<td><%= link_to 'Destroy', { action: :destroy, id: post.id }, method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
在routes.rb
中Blog::Application.routes.draw do
resources :posts do
resources :comments
end
root to: 'welcome#index'
end
答案 0 :(得分:51)
试试这个
<%= link_to 'Destroy', post, method: :delete, data: { confirm: 'Are you sure?' } %>
答案 1 :(得分:39)
确保gem&#39; jquery-rails&#39;在gemfile中,jquery_ujs包含在app / assets / javascripts / application.js文件中
//= require jquery
//= require jquery_ujs
答案 2 :(得分:14)
对于rails 4.2.X,我有同样的问题。检查了我的所有javascript文件,但无法使其正常工作。如果你仔细查看服务器请求,你将在params中缺少'authenticity_token',因此用户会被注销。 在rails 4.1及更高版本中,你必须使用button_to而不是link_to
答案 3 :(得分:7)
我解决了这个问题,只需添加资产/ javascripts / application.js
//= require jquery_ujs
答案 4 :(得分:3)
确保通过rake路由获得删除REST方法。
DELETE /articles/:id(.:format) articles#destroy
我在这个博客版本中遇到了同样的问题,因为我正在做这两个问题。 http://blog.8thcolor.com/en/2011/08/nested-resources-with-independent-views-in-ruby-on-rails/
我也在尝试学习如何使用Web控制台并在其中撬动。 我的问题是binding.pry没有出现在destroy方法中,但会显示出来。这告诉我它一定是一个糟糕的链接吗?它甚至没有达到破坏方法。谢谢大家的答案。我们确实要尝试不要的东西吗? 试图
<td><%= link_to 'Destroy', { action: :destroy, id: post.id }, method: :delete, data: { confirm: 'Are you sure?' } %></td>
不适用于那个。
这是他的所作所为
<td><%= link_to 'Destroy', [comment.post, comment], :confirm => 'Are you sure?', :method => :delete %></td>
因为你只想在这里删除评论。
但到目前为止,如下所示的组合没有给出任何错误,但我仍然没有来自控制器中destroy方法的binding.pry。
<td><%= link_to 'Destroy', [comment.post, comment], method: :delete, data: { confirm: 'Are you sure?' } %></td>
我从来没有像你期望的那样得到确认。
所以试着弄清楚jquery正在发生什么事情。 我可以确认这是我的情况,但剩下的我将留给nubes,因为这将显示在谷歌搜索。
答案 5 :(得分:2)
Started GET "/posts/4" for 127.0.0.1 at 2013-08-09 13:45:20 -0600
这就是问题所在。即使您在链接中使用了method: delete
,删除链接仍在使用GET http动词。
答案 6 :(得分:2)
在js中包含以下行
//= require jquery_ujs
包括gem:
gem 'jquery-rails'
销毁链接:
<%= link_to "Logout", destroy_user_session_path %>
答案 7 :(得分:1)
我遇到了同样的问题,并意识到我使用-J
创建了我的rails应用,与--skip-javascript
相同。
您需要启用JavaScript才能实现此功能;没有弹出窗口确认删除是一个死的赠品。
答案 8 :(得分:0)
我确实遇到了这个问题,这是由于三次点击Guide的代码块并将代码直接复制/粘贴到我的编辑器(OSX上的ST2)引起的。
您应该检查生成的链接HTML是否如下所示:
<a data-confirm="Are you sure?" data-method="delete" href="/posts/3/comments/3" rel="nofollow">Destroy Comment</a>
如果没有,但是看起来如下所示,则不会应用Javascript:
<a href="/posts/3/comments/3" data="{:confirm=>"Are you sure?"}" method="delete">Destroy Comment</a>
href
和未解析的Ruby之间的巨大差距是由指南中使用的不间断空格(unicode字符\u00a0
)复制到脚本中引起的。
我不确定为什么这不会导致脚本解析错误。
答案 9 :(得分:0)
我和巴里有同样的问题。确保您在/app/views/index.html.erb文件中正确复制/粘贴并检查呈现的html。
答案 10 :(得分:0)
我有同样的问题。在我的情况下,我从
更改了\ app \ views \ layouts \ application.html.erb文件<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
<%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
到
<%= stylesheet_link_tag 'default', media: 'all', 'data-turbolinks-track' => true %>
<%= javascript_include_tag 'default', 'data-turbolinks-track' => true %>
避免我的第一个Rails问题。但它显然破坏了JavaScript执行并导致了Destroy问题。 因此,将\ app \ views \ layouts \ application.html.erb文件回滚到其原始状态,并将此问题视为此处
Rails ExecJS::ProgramError in Pages#home?
答案 11 :(得分:0)
我遇到了同样的问题。我通过这种方式锻炼:
我的环境是: A. ruby 2.2.4p230(2015-12-16修订版53155)[x64-mingw32] B. Rails 4.2.5 C.浏览器:Firfox 44.02
在html页面中添加include js,因为delete函数将使用js来处理。
<%= javascript_include_tag "application" %>
将skip_before_action :verify_authenticity_token
添加到控制器以防止AdsController中的InvalidAuthenticityToken#destroy
将link_to添加到您的网页中
<%= link_to 'Delete', post, method: :delete, data: {confirm: "Are you sure?"}%>
现在,我可以使用link_to从我的页面删除记录。
答案 12 :(得分:0)
使用button_to
方法代替link_to
似乎可行,去掉了不能确认的事实(我认为这很重要)。
就我而言,我使用的是React-on-rails并具有多种布局。
在我的世界布局中添加<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
可以解决此问题。