Rails 3向RESTful控制器添加GET操作

时间:2010-08-05 15:44:50

标签: ruby-on-rails ruby-on-rails-3 routing

我有一个带有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

修改

当我将当前操作移动到应用程序控制器时,一切都按预期工作。命名路由必须与资源路由冲突。

/修改

我错过了什么?是否有更好的路由方法?

1 个答案:

答案 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中不再使用地图,它会给你一个弃用警告。