我有一个带有7个RESTful动作的控制器以及一个额外的“当前”动作,它返回第一个活动的foo记录:
class FooController < ApplicationController
def current
@user = User.find(params[:user_id])
@foo = @user.foos.where(:active => true).first
#use the Show View
respond_to do |format|
format.html { render :template => '/foos/show' }
end
end
#RESTful actions
...
end
Foo模型:属于用户模型和用户模型:has_many Foos。
如果我这样构建路线:
resources :users do
resources :foos do
member do
get :current
end
end
end
生成的路由是'/ users /:user_id / foos /:id'。我不想明确指定foo:id。
我也试过了:
map.current_user_foo '/users/:user_id/current_foo', :controller => 'foos', :action => 'current'
resources :users do
resources :foos
end
结果路线更像我期望的那样:'/ users /:user_id / current_foo'。
当我尝试使用此路由时,出现错误信息:
ActiveRecord::RecordNotFound in FoosController#current
Couldn't find Foo without an ID
修改
当我将当前操作移动到应用程序控制器时,一切都按预期工作。命名路由必须与资源路由冲突。
/修改
我错过了什么?是否有更好的路由方法?
答案 0 :(得分:3)
我认为你想要在集合上定义当前,而不是成员(成员是添加:id的成员)。
试试这个。
resources :users do
resources :foos do
collection do
get :current
end
end
end
哪个应该给你这样的路线:
current_user_foos GET /users/:user_id/foos/current(.:format) {:controller=>"foos", :action=>"current"}
此外,RC中不再使用地图,它会给你一个弃用警告。