“没有路线匹配”:带有路由轨道命名空间的噩梦
Posted
技术标签:
【中文标题】“没有路线匹配”:带有路由轨道命名空间的噩梦【英文标题】:"No route matches" : Nightmare with routing rails namespace 【发布时间】:2012-10-15 09:26:09 【问题描述】:我对一个会导致错误操作“显示”而不是“新”的命名空间 URL 感到疯狂。
当我使用这个 URL 时:admin/admin_utilisateurs/new 我得到这个错误:
Routing Error
No route matches :action=>"show", :controller=>"admin/admin_utilisateurs"
Try running rake routes for more information on available routes.
这是我在索引页中使用的 link_to:
link_to 'Nouveau', new_admin_admin_utilisateur_path, :class => 'btn-text btn-dimensions btn-encrusted metal'
这些是我的 rake 路线:
root / welcome#index
pub_responsables GET /catalogs/managers(.:format) pub_responsables#index
POST /catalogs/managers(.:format) pub_responsables#create
new_pub_responsable GET /catalogs/managers/new(.:format) pub_responsables#new
edit_pub_responsable GET /catalogs/managers/:id/edit(.:format) pub_responsables#edit
pub_responsable GET /catalogs/managers/:id(.:format) pub_responsables#show
PUT /catalogs/managers/:id(.:format) pub_responsables#update
DELETE /catalogs/managers/:id(.:format) pub_responsables#destroy
new_admin_utilisateur_session GET /admin_utilisateurs/sign_in(.:format) devise/sessions#new
admin_utilisateur_session POST /admin_utilisateurs/sign_in(.:format) devise/sessions#create
destroy_admin_utilisateur_session DELETE /admin_utilisateurs/sign_out(.:format) devise/sessions#destroy
admin_utilisateur_password POST /admin_utilisateurs/password(.:format) devise/passwords#create
new_admin_utilisateur_password GET /admin_utilisateurs/password/new(.:format) devise/passwords#new
edit_admin_utilisateur_password GET /admin_utilisateurs/password/edit(.:format) devise/passwords#edit
PUT /admin_utilisateurs/password(.:format) devise/passwords#update
cancel_admin_utilisateur_registration GET /admin_utilisateurs/cancel(.:format) admin_utilisateurs/registrations#cancel
admin_utilisateur_registration POST /admin_utilisateurs(.:format) admin_utilisateurs/registrations#create
new_admin_utilisateur_registration GET /admin_utilisateurs/sign_up(.:format) admin_utilisateurs/registrations#new
edit_admin_utilisateur_registration GET /admin_utilisateurs/edit(.:format) admin_utilisateurs/registrations#edit
PUT /admin_utilisateurs(.:format) admin_utilisateurs/registrations#update
DELETE /admin_utilisateurs(.:format) admin_utilisateurs/registrations#destroy
admin_utilisateur_confirmation POST /admin_utilisateurs/confirmation(.:format) devise/confirmations#create
new_admin_utilisateur_confirmation GET /admin_utilisateurs/confirmation/new(.:format) devise/confirmations#new
GET /admin_utilisateurs/confirmation(.:format) devise/confirmations#show
admin_utilisateur_unlock POST /admin_utilisateurs/unlock(.:format) devise/unlocks#create
new_admin_utilisateur_unlock GET /admin_utilisateurs/unlock/new(.:format) devise/unlocks#new
GET /admin_utilisateurs/unlock(.:format) devise/unlocks#show
admin_admin_utilisateurs GET /admin/admin_utilisateurs(.:format) admin/admin_utilisateurs#index
POST /admin/admin_utilisateurs(.:format) admin/admin_utilisateurs#create
new_admin_admin_utilisateur GET /admin/admin_utilisateurs/new(.:format) admin/admin_utilisateurs#new
edit_admin_admin_utilisateur GET /admin/admin_utilisateurs/:id/edit(.:format) admin/admin_utilisateurs#edit
admin_admin_utilisateur GET /admin/admin_utilisateurs/:id(.:format) admin/admin_utilisateurs#show
PUT /admin/admin_utilisateurs/:id(.:format) admin/admin_utilisateurs#update
DELETE /admin/admin_utilisateurs/:id(.:format) admin/admin_utilisateurs#destroy
关于信息,我在一个名为“admin_utilisateurs”的用户表上使用设计。 设计与选项配合得很好::database_authenticable, :confirmable, :recoverable, :registerable, :trackable, :timeoutable, :validatable, :lockable
关键是我在 admin_utilisateurs 表上设置了另一个用于管理目的的控制器。
这是我的 config/routes.rb
root :to => 'welcome#index'
resources :pub_responsables, :path =>'/catalogs/managers'
devise_for :admin_utilisateurs, :controllers => :registrations => 'admin_utilisateurs/registrations'
namespace :admin do
resources :admin_utilisateurs
end
所以我的管理控制器位于 app/controllers/admin/admin_utilisateurs_controller.rb
这是我的 'new' 控制器操作的操作:
class Admin::AdminUtilisateursController < ApplicationController
before_filter :authenticate_admin_utilisateur!
...
def new
@admin_utilisateur = AdminUtilisateur.new
respond_with(@admin_utilisateur)
end
...
end
该控制器的视图位于 app/view/admin/admin_utilisateurs/
但问题确实与路由有关,因为“显示”、“编辑”和“更新”的其他路径工作正常。
如果我删除了我的控制器 app/controllers/admin/admin_utilisateurs_controller.rb,Rails 不会抱怨缺少控制器,她仍然会抱怨“没有显示操作的路线”。
我真的迷路了。有人可以建议吗? 提前致谢
===== 更新 1 =====
这是与我的 URL 请求相关的日志:
Started GET "/admin/admin_utilisateurs/new" for 127.0.0.1 at 2012-10-25 12:55:05 +0200
Processing by Admin::AdminUtilisateursController#new as html
Rendered shared/_main_title.html.haml (0.4ms)
Rendered admin/admin_utilisateurs/_form.html.haml (17.2ms)
Rendered admin/admin_utilisateurs/new.html.haml within layouts/application (31.7ms)
Completed 500 Internal Server Error in 45ms
ActionController::RoutingError (No route matches :action=>"show", :controller=>"admin/admin_utilisateurs"):
app/views/admin/admin_utilisateurs/_form.html.haml:1:in `_app_views_admin_admin_utilisateurs__form_html_haml___780348754_85631840'
app/views/admin/admin_utilisateurs/new.html.haml:9:in `_app_views_admin_admin_utilisateurs_new_html_haml__296364877_85537950'
app/controllers/admin/admin_utilisateurs_controller.rb:51:in `new'
看起来路由正确,但是视图有问题。
我尝试删除控制器文件 admin_utilisateurs_controller.rb 但这次重新启动我的 Web 服务器(sudo service apache2 restart)并且错误有所不同。 这次我得到了“路由错误未初始化常量 Admin::AdminUtilisateursController”。
所以在我看来,这确认有一个问题...... 深入挖掘...
【问题讨论】:
【参考方案1】:好的,我找到了问题。 问题来自我用于“编辑”操作和“新”操作的部分表单视图:/app/views/admin/admin_utilisateurs/_form.html.haml
= form_for @admin_utilisateur, :url => admin_admin_utilisateur_path, :html => :class => "formulaire-standard" do |f|
= render :partial => 'shared/error_message', :locals => :element => @admin_utilisateur, :debut_erreur => 'Cet utilisateur ne peut être enregistré'
.groupe-champs
.champ
= f.label :nom
= f.text_field :nom, :class => 'input-width-8-col', :required => 'required'
.champ
= f.label :prenom
= f.text_field :prenom, :class => 'input-width-5-col', :required => 'required'
.champ
= f.label :telephone
= f.telephone_field :telephone, :class => 'input-width-5-col', :required => 'required'
.champ
= f.label :mobile
= f.telephone_field :mobile, :class => 'input-width-5-col'
.champ
= f.label :email
= f.email_field :email, :class => 'input-width-8-col', :required => 'required'
.groupe-champs
= render :partial => 'shared/checkboxes_admin_utilisateur', :locals => :resource => @admin_utilisateur
.groupe-champs
.champ-1
= f.check_box :approved
.champ-5
= f.label :approved
.checkbox-explication
= t('activerecord.attributes.admin_utilisateur.explanations.active')
.separator
.groupe-actions
= f.submit 'Enregistrer', :class => 'btn-text btn-dimensions btn-encrusted metal'
= link_to 'Annuler', admin_admin_utilisateur_path, :class => 'btn-text btn-dimensions btn-encrusted metal'
我错误地使用了 form_for 标签。因为我的表单在命名空间中使用,所以我必须将命名空间添加到它的参数中,并删除 :url 选项,否则此表单将仅适用于“编辑”操作:
= form_for [:admin, @admin_utilisateur], :html => :class => "formulaire-standard" do |f|
这段代码让 Rails 猜测使用什么路径来创建新记录或编辑现有记录。所以我不需要指定 :url 和 :method。
第二个错误是(一个经典的)表单底部的link_to。 我忘记了路由助手末尾的“s”(admin_admin_utilisateurSSSS_path):
= link_to 'Annuler', admin_admin_utilisateurs_path, :class => 'btn-text btn-dimensions btn-encrusted metal'
故事的寓意:
始终检查您的 /log/development.log 文件! ;-)
【讨论】:
以上是关于“没有路线匹配”:带有路由轨道命名空间的噩梦的主要内容,如果未能解决你的问题,请参考以下文章