将restful路由设置为总newb

时间:2010-06-03 16:39:39

标签: ruby-on-rails rest

我收到以下错误:

未知行动

没有任何行动回应展示。操作:激活,销毁,索引,org_deals,搜索和暂停

控制器:

class Admin::HomepagesController < Admin::ApplicationController

def org_deals
@organization = Organization.find(:all)
end

路线:

   map.root :controller => 'main'
   map.admin '/admin', :controller => 'admin/main'

   map.namespace :admin do |admin|
   admin.resources :organizations, :collection => {:search => :get}, :member => {:suspend => :get, :activate => :get}

注意:这是控制器内部的控制器。

知道为什么这是默认显示?

更新

我更新了路由语法。阅读那篇文章,并尝试了很多变化,但它仍然坚定地寻找一个节目。

2 个答案:

答案 0 :(得分:3)

首先,您的routes文件看起来有错误的语法。如果您尝试为嵌套资源建立路由,则可以这样做:

map.resources :admin
  admin.resources :organizations
end

这将为您提供如下路径:

/admin/
/admin/1
/admin/1/organizations
/admin/1/organizations/1

从路由到控制器/操作的映射是通过Rails约定完成的,其中HTTP动词以对典型CRUD操作有用的方式分配。例如:

/admin/1/organizations/1

将映射到OrganizationsController中的多个操作,区别在于动词的类型:

/admin/1/organizations/1 # GET -> :action => :show
/admin/1/organizations/1 # PUT -> :action => :update
/admin/1/organizations/1 # DELETE -> :action => :destroy

“显示”是Rails默认为您提供的七个标准资源操作之一。您可以使用指令:except => :show排除“show”,或者仅使用:only => :update指定您需要的资源丰富的操作。

我建议您查看Rails Routing from the Outside In,这是对此主题的精彩介绍。

修改

我看到我在答案中忽略了命名空间,抱歉。怎么样:

  map.namespace(:admin) do |admin|
    admin.resources :homepages, :member => { :org_deals => :get }
  end

这会将您的org_deals操作生成为带有id参数的GET(适用于组织)。您还可以获得show路线以及其他六条足智多谋的路线。 rake routes显示了这一点:

org_deals_admin_homepage GET /admin/homepages/:id/org_deals(.:format) {:controller=>"admin/homepages", :action=>"org_deals"}

当然,您homepages_controller.rb必须住在app/controllers/admin/

编辑 redux

实际上,你想在路径中organizations,我敢打赌,在这种情况下:

  map.namespace(:admin) do |admin|
    admin.resources :organizations, :controller => :homepages, :member => { :org_deals => :get }
  end

给你:

org_deals_admin_organization GET    /admin/organizations/:id/org_deals(.:format) {:controller=>"admin/homepages", :action=>"org_deals"}

答案 1 :(得分:0)

通过指定admin.resources ...您告诉Rails,您需要应用程序中的七个默认不同路由。如果您不想要它们,并且只想要指定的那些,请不要使用.resources。调用Show是因为当您拥有默认资源时,这是为具有/admin/id路径的GET请求调用的默认路由。