我正在尝试“管理”用户,而不是通过操作“新”和“显示”用户。这个问题出现在我怀疑的路线中,因为我的链接'/ users / manage'是作为'show'动作的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
end
Ruby / rails将'/ users / manage'视为':controller /:action /:id'即'users / show / 1' 即可。
当使用'/ users / manage / 1'编辑单个用户时,通过UsersController'manage'功能加载正确的:action(作为'manage'),并显示所有内容从manage.html.erb文件进行编辑。在他的情况下,UsersController正确地看到'manage'而不是'show',但仅仅是因为:传递了id,使':controller /:action /:id'路由启动并工作。
'用户/管理',:控制器/:操作似乎是问题,无法将'manage'视为有效:仅限操作,而是发送是'show'中的: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
有人可以帮我解决这个问题吗?
为什么'show'动作会自动进行?我可以强制路由中的“用户”和“管理”在控制器中被识别为“管理”而不是“显示”吗?
感谢帮助人们:)
和平。
修改的 佣金路线
$ 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)
答案 0 :(得分:6)
您实际上从未实际映射过“管理”操作。您 但是通过map.resources:users来映射/用户,/ users /:id,/ users /:id / edit以及更多(post,put,delete)路由。检查您的rake routes
,了解您的确切映射。
根据您的问题,在您的情况下,您可以按如下方式添加到用户资源的路由:
map.resources :users, :collection => {:manage => :get}
这将为您的操作添加/ users / manage GET路由。您可以通过这种方式添加:member(s)或:collection(s)。不同之处在于成员将期望提供:id,而收集则不会。
阅读rails路线指南中的更多内容:http://guides.rubyonrails.org/routing.html
您可能要做的是创建一个管理员namespace来管理用户。然后您的用户可以通过/ admin / users,/ admin / users /:id,/ admin / users /:id / edit等进行访问。这样,您可以将管理用户的界面与用户界面分开。用户正在编辑自己的个人资料。这是一种更好的做法,因为这样您就不需要提出像/ users / manage这样的自定义路由。它将为管理提供CRUD区域,与用户自己的CRUD区域无关。
答案 1 :(得分:2)
您可以为控制器的其他GET类型操作添加如下路线 -
resources :users do
collection do
get 'manage'
end
end
答案 2 :(得分:0)
如果要重命名路由,请在路由中使用:path_names hash。
map.resources :photos, :path_names => { :new => 'make', :edit => 'change' }
这会导致路由到 识别诸如
之类的URL/photos/make /photos/1/change
此选项不会更改实际操作名称; 显示的两个URL仍然会路由 新的和编辑行动。
有关详细信息,请参阅本指南:http://guides.rubyonrails.org/routing.html
答案 3 :(得分:0)
我知道这是超级迟到的2020年,但是如果您无意中将路径复制到route.rb中,则会出现这种奇怪的情况。 例如: #routes.rb
resources :users
...(bunch of other routes declaration later)
resources users do
collection do
get :manage
end
这将导致当您尝试访问GET / users / manage时,它将进入:show操作。我在您发布的屏幕截图中看到,您的/ users路由列出了两次。这是一个指标。找到简单的resources :users
并将其删除,并保留其中的更多内容,因为这是您需要的版本。