我有三个相关的模型:公司,项目和链接,我正在尝试创建一个系统,我们根据他们创建的链接生成路线,例如:
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
如何设置此系统:
@company = Company.find_by_path(params[:path])
)@link = Link.find_by_link_and_company_id(params[:link],@company.id)
)如果由于任何原因上述情况不明确,我道歉。我试着尽力解释!感谢。
答案 0 :(得分:1)
您应该查看有关RESTful路由的ActionController::Routing,ActionController::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
的所有其他操作。