【问题标题】:Rails 3 add GET action to RESTful controllerRails 3 将 GET 操作添加到 RESTful 控制器
【发布时间】:2010-08-05 15:44:50
【问题描述】:

我有一个控制器,它包含 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

编辑

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

/编辑

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

【问题讨论】:

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


    【解决方案1】:

    我认为您想在集合上定义 current,而不是成员(成员是添加 :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 中使用,它会给你一个弃用警告。

    【讨论】:

    • 有点不直观,但它起作用了——谢谢。如果找不到匹配的 foo,关于如何处理此案的任何想法?我可能想显示一个说明“那个人没有 foo”的页面,而不是路由回最后一页并显示一条消息。
    • 嗯,很难说,用户如何选择当前的 foo?您是否正在查看用户,然后单击按钮/点击链接以查找分配给该用户的当前 foo?如果是这样,我会考虑回到请求页面,并通知说,没有找到 foos 就可以了..
    猜你喜欢
    • 2015-05-12
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    相关资源
    最近更新 更多