用户定义的路由

时间:2010-06-24 08:05:38

标签: ruby-on-rails routing

我有三个相关的模型:公司,项目和链接,我正在尝试创建一个系统,我们根据他们创建的链接生成路线,例如:

www.site.com/the_company's_specific_path/one_of_company's_links

一家公司has_many:项目,一个项目has_many:links。

结构摘要:

#Company table
company.id
company.path # such as 'Bechtel'

#Project table
project.id
project.company_id

#Link table
link.id
link.link # such as 'railwayproject'
link.project_id
link.company_id # some links may be tied to the company and not one specific project

#Final route generated: www.site.com/bechtel/railwayproject

如何设置此系统:

  • 路线的第1部分指定company.path(沿着@company = Company.find_by_path(params[:path])
  • 的行
  • 第2部分找到链接(沿着@link = Link.find_by_link_and_company_id(params[:link],@company.id)
  • 的行
  • 输入此URI / URL后,用户输入“show”,他们会看到有关项目或公司的信息。 (当链接没有专门与项目相关时,我们会显示'list',显示公司的所有项目。)

如果由于任何原因上述情况不明确,我道歉。我试着尽力解释!感谢。

1 个答案:

答案 0 :(得分:1)

您应该查看有关RESTful路由的ActionController::RoutingActionController::Resources的文档,以及有关该主题的方便Rails Guide。还有一些Railscast regarding routes

map.connect :path/:link, :controller => :companies这样简单的东西可行,但根据您现有的路线可能会导致一些问题,而且不是RESTful。如果它没有引起任何冲突,这将允许你做你想要的。

您可以使用:requirements选项向路径添加约束,以缩小被视为匹配的内容:

map.company_link :company/:link, :requirements => { :company => /[\w\-]+/, :link => /[\w\-]+/ }

这只会匹配网址中的单词和短划线(' - ')字符,我相信默认路由仍然可以正常工作。我还使用map.company_link创建了一条命名路线,因此Rails创建了一组网址助手,可以轻松引用您的路线:company_link_path(:company => "Bechtel", :link => "railwayproject")

如果你想坚持使用REST的方式,那就是:

map.resource :companies do |company|
  company.resources :links
end

/companies/1/links/2将传递给links_controller与公司的show动作,链接id作为params。这在前面提到的Rails指南的nested resources部分中进一步解释。通常,您会使用:shallow => true选项,因为链接ID为2已经是唯一的,不需要嵌套在公司下面。嵌套路由的实际值显示所有带有/companies/1/links的链接以及直接转到单个链接/links/2的所有其他操作。