我试图‘管理’用户,而不是‘新’和‘显示’用户通过行动。问题就在我怀疑的路径中,因为我的链接'/users/manage‘被作为id参数接收,以“显示”操作:
进程的终端日志:
Processing UsersController#show (for 127.0.0.1 at 2010-06-28 00:31:45) [GET]
Parameters: {"id"=>"manage"}
ActionController::UnknownAction (No action responded to show. Actions: create, destroy, index, manage, and update):下面是一些相关部分的代码片段:
users/index.html.erb (为进入管理部分而创建的链接,即'/users/ manage '):
<%= link_to('New User', :action => 'manage') %>users_controller.rb (应该接收“管理”操作,但得到“显示”)在上面呼叫:
def index
@users = User.all
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @users }
end
end
def manage
@users = User.all
@user = User.find(params[:id]) if params[:id]
@user = User.new if @user.nil?
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @user }
end
endRuby/rails将'/users/manage'视为':controller/:action/:id',即'users/show/1'.
当使用'/users/manage/1'编辑单个用户时,通过UsersController 'manage‘函数加载适当的:action (作为'manage'),并显示从manage.html.erb文件中编辑的所有内容。在他的情况下,UsersController正确地看到“管理”而不是“显示”,但这只是因为:id被传递,从而使‘:控制器/:action/:id’路由启动并工作。
'users/manage',:控制器/ :action 似乎是问题,不承认“管理”是有效的:动作本身,而是在“显示”中作为:id发送。
routes.rb
ActionController::Routing::Routes.draw do |map|
map.resources :users
map.resources :categories
map.resources :posts
map.connect ':controller/:action'
map.connect ':controller/:action/:id'
map.connect ':controller/:action/:id.:format'
end有人能帮我解决这个问题吗?
为什么“秀”动作是自动进行的?我可以强制‘用户’和‘管理’在路线上被识别为‘管理’,而不是‘显示’?
谢谢大家的帮助:)
和平。
编辑rake路由
$ rake routes
(in /home/krnel/sites/rails_projects/simple_blog)
users GET /users(.:format) {:action=>"index", :controller=>"users"}
POST /users(.:format) {:action=>"create", :controller=>"users"}
new_user GET /users/new(.:format) {:action=>"new", :controller=>"users"}
edit_user GET /users/:id/edit(.:format) {:action=>"edit", :controller=>"users"}
user GET /users/:id(.:format) {:action=>"show", :controller=>"users"}
PUT /users/:id(.:format) {:action=>"update", :controller=>"users"}
DELETE /users/:id(.:format) {:action=>"destroy", :controller=>"users"}
categories GET /categories(.:format) {:action=>"index", :controller=>"categories"}
POST /categories(.:format) {:action=>"create", :controller=>"categories"}
new_category GET /categories/new(.:format) {:action=>"new", :controller=>"categories"}
edit_category GET /categories/:id/edit(.:format) {:action=>"edit", :controller=>"categories"}
category GET /categories/:id(.:format) {:action=>"show", :controller=>"categories"}
PUT /categories/:id(.:format) {:action=>"update", :controller=>"categories"}
DELETE /categories/:id(.:format) {:action=>"destroy", :controller=>"categories"}
posts GET /posts(.:format) {:action=>"index", :controller=>"posts"}
POST /posts(.:format) {:action=>"create", :controller=>"posts"}
new_post GET /posts/new(.:format) {:action=>"new", :controller=>"posts"}
edit_post GET /posts/:id/edit(.:format) {:action=>"edit", :controller=>"posts"}
post GET /posts/:id(.:format) {:action=>"show", :controller=>"posts"}
PUT /posts/:id(.:format) {:action=>"update", :controller=>"posts"}
DELETE /posts/:id(.:format) {:action=>"destroy", :controller=>"posts"}
manage_users GET /users/manage(.:format) {:action=>"manage", :controller=>"users"}
GET /users(.:format) {:action=>"index", :controller=>"users"}
POST /users(.:format) {:action=>"create", :controller=>"users"}
GET /users/new(.:format) {:action=>"new", :controller=>"users"}
GET /users/:id/edit(.:format) {:action=>"edit", :controller=>"users"}
GET /users/:id(.:format) {:action=>"show", :controller=>"users"}
PUT /users/:id(.:format) {:action=>"update", :controller=>"users"}
DELETE /users/:id(.:format) {:action=>"destroy", :controller=>"users"}
/:controller/:action/:id
/:controller/:action/:id(.:format) 发布于 2010-06-28 05:07:56
实际上,您从来没有具体地映射“管理”操作。但是,您正在通过执行/users : map.resources :users映射map.resources、/users/:id、/users/:id/编辑和更多的路由(post、put、delete)。检查你的rake routes,找出你到底映射了什么。
根据您的问题,在您的情况下,您可以向用户资源添加如下路由:
map.resources :users, :collection => {:manage => :get}这将为您的操作添加/用户/管理GET路由。您可以这样添加:成员或:集合。不同之处在于,该成员将期望提供一个:id,而集合则不会。
阅读更多rails路由指南:http://guides.rubyonrails.org/routing.html
正确的道路
您可能要做的是创建一个用于管理用户的Admin 命名空间。然后您的用户可以通过/admin/user、/admin/user/:id、/admin/user/:id/编辑等方式访问。这样,您就可以将管理用户的界面与用户正在编辑自己的配置文件的界面分隔开来。这是一个更好的实践,因为这样您不需要想出像/user/manage这样的自定义路由。它将为用户自己提供一个与CRUD区域无关的CRUD区域进行管理。
发布于 2015-08-06 06:34:26
您可以为控制器的其他GET类型操作添加如下所示的路由-
resources :users do
collection do
get 'manage'
end
end发布于 2010-06-28 12:51:28
如果要重命名路由,请在路由中使用:path_names散列,如下所示。
map.resources :photos, :path_names => { :new => 'make', :edit => 'change' } 这将导致路由识别URL,如 /照片/制作/照片/1/更改 实际操作名称不会被此选项更改;所显示的两个URL仍将路由到新的和编辑的操作。
有关更多信息,请参见本指南:http://guides.rubyonrails.org/routing.html
https://stackoverflow.com/questions/3130126
复制相似问题