【问题标题】:Setting up restful routes as a total newb将宁静的路线设置为全新的
【发布时间】:2010-06-03 16:39:38
【问题描述】:

我收到以下错误:

未知操作

没有任何动作响应显示。操作:激活、销毁、索引、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}

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

知道为什么默认显示?

更新:

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

【问题讨论】:

  • 我可以通过将视图更改为 'show' 来解决这个问题,但为什么默认显示?

标签: ruby-on-rails rest


【解决方案1】:

首先,您的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 =&gt; :show 排除“显示”,或者仅使用 :only =&gt; :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"}

【讨论】:

  • 我发布了错误的语法。我在上面更新了它。我认为该成员和收藏以某种方式覆盖了正在进行的正常操作。不确定..
  • 是的,你的反应很棒。绝对地。我的目标可能不是那么 RESTful,因为我只是想创建一个与 CRUD 无关的侧视图。在这种情况下,我尝试在循环中创建一个“命名路由”。 admin.namespace :组织做 |组织| organization.org_deals 'org_deals', :controller => 'organizations', :action => 'org_deals' end .但这仍然默认为表演。我想我需要在那里添加成员。我尝试了您将 org_deals 添加到成员,但它正在寻找不需要的 Org /:id/ 因为它与他们无关
  • 如果您不想要 :id,请不要使用资源 - 只需创建命名路由,或使用 map.connect
  • admin.namespace :organizations do |organization| organization.org_deals 'org_deals', :action => 'org_deals' end 这会在 rake 路由中创建正确的链接,但它在加载路径时仍在寻找显示操作。我也尝试了连接方式。路线是对的,但它仍然在寻找表演。
【解决方案2】:

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

【讨论】:

  • 所以我可以写这样的东西然后 'admin.org_deals 'org_deals', :controller => 'admin/organizations/', :action => 'org_deals' 。如果是这样,路径会是 'org_deals_admin_organization_path 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
  • 2011-05-26
  • 1970-01-01
  • 2011-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多