【问题标题】:link_to redirect to a wrong controllerlink_to 重定向到错误的控制器
【发布时间】:2012-10-26 15:47:37
【问题描述】:

我有一个名为 'layout_admin' 的管理区域布局。在“layout_admin”中,我有:

<li><%= link_to 'Contenu', :action=>'index', :controller=>'contents' %></li>
<li><%= link_to 'Petitions', :controller => 'petitions', :action => 'index' %></li>

Contenu 的第一个链接可以正常工作,但第二个链接(请愿)让我遇到了一个奇怪的错误:

路由错误 没有路由匹配 {:controller=>"admin/edito"}

在地址栏中我有:localhost:3000/admin/petitions

在 routes.rb 我有:

namespace :admin do resources :petitions 
end

我还必须指出,“edito”是管理区域之外的另一个控制器,它有一个操作“索引”。在 routes.rb 我有 get "edito/index" 关于edito_controller。

有人知道问题的根源吗? 谢谢。

全耙路线:

        temoignages GET    /temoignages(.:format)              temoignages#index

                POST   /temoignages(.:format)              temoignages#create
 new_temoignage GET    /temoignages/new(.:format)          temoignages#new
edit_temoignage GET    /temoignages/:id/edit(.:format)     temoignages#edit
     temoignage GET    /temoignages/:id(.:format)          temoignages#show
                PUT    /temoignages/:id(.:format)          temoignages#update
                DELETE /temoignages/:id(.:format)          temoignages#destroy
admin_petitions GET    /admin/petitions(.:format)          admin/petitions#index
                POST   /admin/petitions(.:format)          admin/petitions#create
new_admin_petition GET    /admin/petitions/new(.:format)      admin/petitions#new
edit_admin_petition GET    /admin/petitions/:id/edit(.:format) admin/petitions#edit
 admin_petition GET    /admin/petitions/:id(.:format)      admin/petitions#show
                PUT    /admin/petitions/:id(.:format)      admin/petitions#update
                DELETE /admin/petitions/:id(.:format)      admin/petitions#destroy
 admin_contents GET    /admin/contents(.:format)           admin/contents#index
                POST   /admin/contents(.:format)           admin/contents#create
new_admin_content GET    /admin/contents/new(.:format)       admin/contents#new
edit_admin_content GET    /admin/contents/:id/edit(.:format)  admin/contents#edit
  admin_content GET    /admin/contents/:id(.:format)       admin/contents#show
                PUT    /admin/contents/:id(.:format)       admin/contents#update
                DELETE /admin/contents/:id(.:format)       admin/contents#destroy
    admin_posts GET    /admin/posts(.:format)              admin/posts#index

                POST   /admin/posts(.:format)              admin/posts#create
  new_admin_post GET    /admin/posts/new(.:format)          admin/posts#new
  edit_admin_post GET    /admin/posts/:id/edit(.:format)     admin/posts#edit
     admin_post GET    /admin/posts/:id(.:format)          admin/posts#show
                PUT    /admin/posts/:id(.:format)          admin/posts#update
                DELETE /admin/posts/:id(.:format)          admin/posts#destroy
                GET    /admin/posts(.:format)              admin/posts#index

                POST   /admin/posts(.:format)              admin/posts#create
                GET    /admin/posts/new(.:format)          admin/posts#new
                GET    /admin/posts/:id/edit(.:format)     admin/posts#edit
                GET    /admin/posts/:id(.:format)          admin/posts#show
                PUT    /admin/posts/:id(.:format)          admin/posts#update
                DELETE /admin/posts/:id(.:format)          admin/posts#destroy
  admin_backend_index GET    /admin/backend(.:format)            admin/backend#index
                POST   /admin/backend(.:format)            admin/backend#create
  new_admin_backend GET    /admin/backend/new(.:format)        admin/backend#new

  edit_admin_backend GET    /admin/backend/:id/edit(.:format)   admin/backend#edit
  admin_backend GET    /admin/backend/:id(.:format)        admin/backend#show
                PUT    /admin/backend/:id(.:format)        admin/backend#update
                DELETE /admin/backend/:id(.:format)        admin/backend#destroy
     lois_index GET    /lois/index(.:format)               lois#index
      lois_show GET    /lois/show(.:format)                lois#show
    edito_index GET    /edito/index(.:format)              edito#index
  reponses_index GET    /reponses/index(.:format)           reponses#index
  reponses_show GET    /reponses/show(.:format)            reponses#show
  lettres_index GET    /lettres/index(.:format)            lettres#index
   lettres_show GET    /lettres/show(.:format)             lettres#show
       accueils POST   /accueils(.:format)                 accueils#create
   new_accueils GET    /accueils/new(.:format)             accueils#new
  edit_accueils GET    /accueils/edit(.:format)            accueils#edit
                GET    /accueils(.:format)                 accueils#show
                PUT    /accueils(.:format)                 accueils#update
                DELETE /accueils(.:format)                 accueils#destroy
           root        /                                   accueil#index

【问题讨论】:

  • 你能发布rake routes给你的东西吗?或者至少是它的相关部分?
  • 如果你尝试这个会发生什么? &lt;li&gt;&lt;%= link_to 'Petitions', admin_petitions %&gt;&lt;/li&gt;
  • 是什么让您认为是第二个link_to 导致了问题?您能否包含一条指向该行的错误消息?
  • @AnthonyAlberto 不要忘记 _path 位。
  • 同样的错误,Routing Error No route matches {:controller=&gt;"admin/edito"}&lt;%= link_to 'Petitions', admin_petitions %&gt; ...

标签: ruby-on-rails-3


【解决方案1】:

看到rake routes 左栏中的路线名称了吗?使用该信息来构建对不同路径助手的调用:

<li><%= link_to 'Contenu', admin_contents_path %></li>
<li><%= link_to 'Petitions', admin_petitions_path %></li>

一般来说,这就是您应该在 Rails 3+ 应用程序中构建 URL 的方式。

阅读Rails Routing from the Outside In了解更多信息(尤其是2.3: Paths and URLs)。

更新:

您应该考虑在访问 /admin/petitions 时在被拉出的视图上使用这些 _path 样式的帮助器。

我敢打赌,您在页面上有一个类似于此的链接:

<%= link_to "Link Text", :controller => "edito", :action => "index" %>

它试图在admin 命名空间中找到edito,因为当您访问/admin/petitions 时,您在应用程序中的位置。

要修复,您需要将其更新为如下所示:

<%= link_to "Link Text", edito_index_path %>

对应用中的所有链接、表单和 url_for 引用进行清洗、冲洗和重复操作。

【讨论】:

  • 我愿意!但它不适用于admin_petitions_path ... 但它可以使用admin_contents_path 我现在就使用它,谢谢!为什么它不适用于请愿书?
  • /admin/petitions 上的另一个链接一定有问题。您需要在整个页面中使用这种链接方式,而不仅仅是在布局中。我会更新我的答案。
  • 这非常有用,谢谢克里斯!感谢 Noodl 和 Anthony Alberto !我为我糟糕的英语道歉。再见
猜你喜欢
  • 2014-09-21
  • 2017-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多