RoR路由错误 - 没有路由匹配[GET]" / articles / 8 / destroy"

时间:2015-07-24 20:50:27

标签: ruby-on-rails ruby

我正在guides.rubyonrails.org上发布官方Rails指南,并且我遇到了以下错误:

当我在浏览器地址栏中输入路径时,没有路由匹配[GET]" / articles / 8 / destroy" 。单击模板文件中的链接,不会删除已传递ID的文章,只需重定向到它(文章)。 Rails版本是4.2.1,数据库是sqlite,工作环境是Windows 7。

销毁方法如下:

def destroy
    @article = Article.find(params[:id])
    @article.destroy

    redirect_to articles_path
  end

Rake路线输出是:

articles_path       GET     /articles(.:format)             articles#index
                    POST    /articles(.:format)             articles#create
new_article_path    GET     /articles/new(.:format)         articles#new
edit_article_path   GET     /articles/:id/edit(.:format)    articles#edit
article_path        GET     /articles/:id(.:format)         articles#show
                    PATCH   /articles/:id(.:format)         articles#update
                    PUT     /articles/:id(.:format)         articles#update
                    DELETE  /articles/:id(.:format)         articles#destroy
root_path           GET     /                               welcome#index

我检查过拼写错误,即使是c / p所有来源,结果也一样。和想法?

编辑:添加删除链接

删除链接如下:

<%= link_to 'Destroy', article_path(article),
              method: :delete,
              data: { confirm: 'Are you sure?' } %>

views / layouts /中application.html.erb的内容如下:

<!DOCTYPE html>
<html>
<head>
  <title>Blog</title>
  <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track' => true %>
  <%= javascript_include_tag 'default', 'data-turbolinks-track' => true %>
  <%= csrf_meta_tags %>
</head>
<body>

<%= yield %>

</body>
</html>

javascript_include_tag&#39;默认&#39;已从&#39;应用程序&#39;更改到了#defaul&#39;,另外我得到了coffeescript错误。

4 个答案:

答案 0 :(得分:2)

路线找不到解释

您的路线显示DELETE /articles/:id(.:format) articles#destroy。这意味着它期待HTTP DELETE方法。

要使/articles/8/destroy工作,您的路线应按照以下方式定义:

get '/articles/:id/destroy' => 'articles#destroy'

但是,不是推荐的方法,而是确保在your delete link中设置删除方法。

手动测试

如果您想手动测试,可以尝试使用curl或Chrome插件postman等工具。

这两个工具都允许您指定要使用的HTTP方法。如果您通过浏览器发出直接请求,您所做的只是发送GET请求。

答案 1 :(得分:0)

当您在网址中点击此/articles/8/destroy时,会将其视为get请求,因为您可以看到错误。 没有路线匹配[GET]&#34; / articles / 8 / destroy&#34;

但是DESTROY操作在rails中接受delete请求,您也可以在路径中看到。现在我不确定你是如何从模板触发的,但考虑到你的文章在对象article

,它应该是这样的
  <%= link_to "Delete", article, method: :delete, data: { confirm: 'Are you sure?' } %>  

答案 2 :(得分:0)

正如这条线所述:

DELETE  /articles/:id(.:format)         articles#destroy

服务器期望DELETE请求触发控制器中的destroy方法。这样的事情,从轨道上的每个指南应该做:

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

使用link_to方法的delete助手会创建一个隐藏的表单,并在点击时提交。

答案 3 :(得分:0)

确保在应用程序中包含用于jQuery的Rails不显眼的脚本编写适配器。否则,使用method: :delete创建的链接将无法正确处理。

这是通过JavaScript文件jquery_ujs完成的,当您生成应用程序时,该文件会自动包含在应用程序的布局(app / views / layouts / application.html.erb)中。