Rails 4中删除链接显示“没有匹配路由”

3

我是第一次使用Rails 4的Ruby。错误出现在删除动作的链接中,错误信息如下:

Subjects#index中的ActionController::UrlGenerationError无法匹配路由{:action =>“delete”,:controller =>“subjects”,:id => 1}

我认为问题在于路由设置。我的list.html.erb代码如下:

<div class="subject list">
    <h2>Subjects</h2>
    <%= link_to("Add New Subject", {:action => 'new'}, :class => 'action new') %>
    <table class="listing" summary="Subject list">
        <tr>
            <th>Position</th>
            <th>Subject</th>
            <th>Visible</th>
            <th>Pages</th>
            <th>Actions</th>
        </tr>
        <% @subjects.each do |subject| %>
        <tr>
            <td><%= subject.position %></td>
            <td><%= subject.name %></td>
            <td class="center"><%= subject.visible ? 'Yes' : 'No' %></td>
            <td class="center"><%= subject.pages.size %></td>
            <td class="actions">
                <%= link_to("Show",{:action => 'show', :id => subject.id}, :class => 'action show') %>
                <%= link_to("Edit",{:action => 'edit', :id => subject.id}, :class => 'action edit') %>
            <!--error is showing in this line-->    <%= link_to("Delete",{:action => 'delete', :id => subject.id}) %> 

            </td>
        </tr>
        <% end %>
    </table>
</div>

路由的代码是-

resources :subjects

除了删除和销毁操作因为我的路由设置不成熟而无法正常工作外,所有列表、显示、编辑和更新操作都可以正常运行。建议将对此进行改进。


我已更改路由文件:

 get 'subjects/index'
  get 'subjects/list'
  get 'subjects/new'
  get 'subjects/edit'
  get 'subjects/delete'
  get 'subjects/destroy'
  resources :subjects do
    member do
      get 'show', to: 'show#id'
    end
  end

现在,如果我通过以下URL手动调用删除操作: http://localhost:3000/subjects/delete?id=8 模板会加载。
现在,如果我手动通过以下URL调用销毁操作: http://localhost:3000/subjects/destroy?id=8 即使如此,数据仍然会从数据库中被删除。
但是,在我的list.html.erb文件中的链接却不起作用。
<%= link_to 'Delete', subject, method: :delete %>

调用show操作会导致生成此URL。
http://localhost:3000/subjects/1/show
 and the error occurs :


No route matches [DELETE] "/subjects/1/show"

Rails.root: D:/ruby/sam_app

Application Trace | Framework Trace | Full Trace
Routes

Routes match in priority from top to bottom

Helper  HTTP Verb   Path    Controller#Action
Path / Url          
subjects_index_path GET /subjects/index(.:format)   subjects#index
subjects_list_path  GET /subjects/list(.:format)    subjects#list
subjects_new_path   GET /subjects/new(.:format) subjects#new
subjects_edit_path  GET /subjects/edit(.:format)    subjects#edit
subjects_delete_path    GET /subjects/delete(.:format)  subjects#delete
subjects_destroy_path   GET /subjects/destroy(.:format) subjects#destroy
subject_path    GET /subjects/:id/show(.:format)    show#id
subjects_path   GET /subjects(.:format) subjects#index
POST    /subjects(.:format) subjects#create
new_subject_path    GET /subjects/new(.:format) subjects#new
edit_subject_path   GET /subjects/:id/edit(.:format)    subjects#edit
GET /subjects/:id(.:format) subjects#show
PATCH   /subjects/:id(.:format) subjects#update
PUT /subjects/:id(.:format) subjects#update
DELETE  /subjects/:id(.:format) subjects#destroy

同样适用于delete.html.erb中的销毁按钮。

现在我卡住了。

4个回答

3

常备参考...将路由复制到本地文件中,使用:

rake routes >> paths.txt,然后您随时可以参考它..其外观如下:

                        dashboard_index GET    /dashboard(.:format)                                         dashboard#index
                                        POST   /dashboard(.:format)                                         dashboard#create
                          new_dashboard GET    /dashboard/new(.:format)                                     dashboard#new
                         edit_dashboard GET    /dashboard/:id/edit(.:format)                                dashboard#edit
                              dashboard GET    /dashboard/:id(.:format)                                     dashboard#show
                                        PUT    /dashboard/:id(.:format)                                     dashboard#update
                                        DELETE /dashboard/:id(.:format)                                     dashboard#destroy

如你所见,不同的方法需要使用哪些HTTP动词才能生效......例如,正如@Marek Lipka所说,我的删除操作只有在方法调用类型为delete时才会生效......


这是不必要的复制 - 直接转到 /x,例如:http://localhost:3000/x - cb24

3
这个问题虽然有些陈旧,但还没有选择的答案,所以我想发表我的看法。
这个:
get 'subjects/index'
get 'subjects/list'
get 'subjects/new'
get 'subjects/edit'
get 'subjects/delete'
get 'subjects/destroy'
resources :subjects do
  member do
    get 'show', to: 'show#id'
  end
end

如果您在浏览器地址栏中输入,它将使用GET请求(因为Rails路由具有“首次出现优先级”,如日志所示路由按顺序从上到下匹配),这意味着您创建了一个GET destroy路由,而由resources :subjects 创建的DELETE destroy 被忽略。

我建议您摆脱那些get 'subjects/*' ,并使用以下代码作为删除按钮:

<%= link_to 'Delete', subject_path(subject), method: :delete %>

并在您的控制器上使用destroy方法执行您的操作。


2

destroy操作的路径与show操作的路径相同(如果您使用resources)。唯一不同的是HTTP方法,showGET,而destroyDELETE。因此,您的链接应如下所示:

<%= link_to "Delete", subject, method: :delete %>

此外,在subjects控制器中,您不应该有多个操作的冗余路由,比如get 'subjects/index',也不应该定义成员show操作,就像您试图做的那样(这没有任何意义)。相反,在您的路由中,您应该只有:
resources :subjects

在进行这种修改后,您的某些链接可能会停止工作,您需要修复它们以使用正确的路由。


如果你问我,bundle exec rake routes 会让你的生活变得更轻松! - Yan Foto
@Samvedna,我的回答有帮到你吗? - Marek Lipka
我已经更改了我的link_to语句@marek,现在我遇到了这个错误路由错误 没有匹配的路由[DELETE]“/subjects/1/show”Rails.root:D:/ruby/sam_app - Samvedna
每次执行动作“显示”而不是“删除”。 - Samvedna
@Samvedna,你确定你的链接看起来完全和我建议的一样吗? - Marek Lipka

0

用户

GET /users(.:format) users#index

POST /users(.:format) users#create

new_user GET /users/new(.:format) users#new

edit_user GET /users/:id/edit(.:format) users#edit

user GET /users/:id(.:format) users#show

PATCH /users/:id(.:format) users#update

PUT /users/:id(.:format) users#update

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

您可以直接删除

<%= link_to("Delete", user, method: :delete)%>

默认情况下,用户包含ID并且它将直接删除您的用户

如果您想先执行删除方法,然后再执行销毁方法,则需要在路由文件中添加以下路由,但它应该是应用程序的最后或默认路由。

match ':controller(/:action(/:id))', :via => [:get, :post]

这实际上是完全不推荐的。使用match ':controller(/:action(/:id)), :via => [:get, :post]'来匹配所有内容是一个重大的安全漏洞。建议明确声明每个控制器、操作和方法,而不是让它们都可以访问。 - Everton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接