【问题标题】:Rails 3 Nested RoutingRails 3 嵌套路由
【发布时间】:2012-03-01 05:25:20
【问题描述】:

我有一个非常有趣的场景:

我指定了两个控制器,一个用于全局事件,另一个用于公司特定事件。在路由中,它是这样指定的:

resources :companies do
  resources :events
end
resources: events

运行 rake routes 我可以看到正在生成的路由:

events GET  /events(.:format) events#index
company_events GET /companies/:company_id/events(.:format) events#index 

两条路径似乎都路由到同一个控制器(全局控制器)... 我在控制器/公司下有第二个控制器,如下所示:

class Companies::EventsController < ApplicationController
 # stuff
end

无论我是否使用 company_evens_path(@company),它都不会在上面的那个控制器中路由。总是去另一个。 它曾经在 Rails 2.3 中为我工作,我目前正在使用 3.2

【问题讨论】:

  • 你确定你需要一个单独的控制器吗,似乎要让它保持干燥,你应该在全局事件控制器的索引操作中抛出一个 if params[:company_id] 来只显示那些事件。
  • 根据您的路线,这按预期工作。都路由到 EventsController 和 index 方法。如果您需要基于所遵循的路线的不同行为,您可以从单个控制器中完成。

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


【解决方案1】:

如上所述,我建议您这样做:

def index
  if params[:company_id]
    @events = Company.find(params[:company_id]).events
  else
    @events = Events.all
  end
end

虽然如果你需要你可以指定一个控制器:

resources :companies do
  resources :events, :controller => "companies/events"
end
resources: events

只需在您的控制器文件夹中创建一个公司文件夹,将您的 Companies::EventsController 放入其中

【讨论】:

  • 这里是文档以获取更多信息guides.rubyonrails.org/…
  • 如果我找不到其他解决方案,我想我将不得不这样做。这将迫使我在控制器中手动渲染模板,这非常......嗯。
  • 哦,是啊,没想到,您可以将模板放在共享文件夹中,然后链接到相同的部分
  • 而不是打败一匹死马,但我只是让单个事件控制器将您正在寻找的特定事件集合返回给您,并且所有其他逻辑都包含在帮助程序中以保持控制器干净
  • 你也不必手动渲染模板,它们只会匹配views/companies/events文件夹中的视图,而不是views/events文件夹
猜你喜欢
  • 2011-09-07
  • 2011-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多