【问题标题】:Shows "no route matches" for delete link rails 4为删除链接导轨 4 显示“无路线匹配”
【发布时间】:2015-03-28 10:01:57
【问题描述】:

我是使用 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 %>

正在调用导致此 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 中的销毁按钮也是如此

现在我被困住了。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 routes action


    【解决方案1】:

    用户

    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

    用户 GET /users/:id(.:format) users#show

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

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

    删除 /users/:id(.:format) users#destroy

    你可以直接删除

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

    其中用户默认包含id,它将直接删除您的用户

    如果您想先执行 delete 方法,然后从那里执行 destroy 方法,那么您需要在路由文件中添加以下路由,但它应该是您应用的最后一个或默认路由。

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

    【讨论】:

    • 这实际上是不推荐的。将所有内容与match ':controller(/:action(/:id)), :via =&gt; [:get, :post] 匹配是一个主要的安全漏洞。建议明确声明您希望它可访问的每个控制器、操作和方法。
    【解决方案2】:

    这个问题很老,但还没有选择的答案,所以我会给我 2 美分。

    这个:

    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 request(如果您在浏览器的地址栏上键入它),因为 rails 路由具有“首次出现优先级”,如您的日志中所示 路由从上到下的优先级匹配,这意味着您正在创建一个GET destroy 路由,而resources :subjects 创建的DELETE destroy 将被忽略。

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

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

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

    【讨论】:

      【解决方案3】:

      始终供参考..在本地文件中复制路线..使用

      rake routes &gt;&gt; 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 类型时,我的删除操作才会起作用....

      【讨论】:

      【解决方案4】:

      destroy 操作的路径与show 操作的路径相同(当然,如果您使用resources)。唯一不同的是 HTTP 方法,GET 用于showDELETE 用于销毁。所以你的链接应该如下所示:

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

      此外,您不应该为 subjects 控制器中的各种操作提供冗余路由,例如 get 'subjects/index' 并且您不应该定义成员 show 操作,就像您尝试做的那样(它不会产生任何感觉)。相反,在您的路线中,您应该只有:

      resources :subjects
      

      您的某些链接可能在此修改后停止工作,您必须修复它们,以便它们使用正确的路线。

      【讨论】:

      • 如果你问我,bundle exec rake routes 会让你的生活更轻松!
      • @Samvedna 我的回答有帮助吗?
      • 我已经更改了我的 link_to 语句 @marek 现在我收到此错误路由错误没有路由匹配 [DELETE] "/subjects/1/show" Rails.root: D:/ruby/sam_app
      • 每次执行动作“显示”而不是“删除”
      • @Samvedna 你确定你的链接和我建议的完全一样吗?
      猜你喜欢
      • 1970-01-01
      • 2016-03-04
      • 2017-03-18
      • 2011-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多