[英]User-defined routing
我有三个相关的模型:公司,项目和链接,并且我试图创建一个系统,在该系统中我们根据它们创建的链接生成路线,例如:
www.site.com/the_company's_specific_path/one_of_company's_links
一家公司has_many:projects,一个项目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)
) 如果上述原因不清楚,我们深表歉意。 我已经尽力解释了! 谢谢。
您应该查看用于RESTful路由的ActionController :: Routing , ActionController :: Resources文档,以及有关该主题的便捷Rails指南 。 关于路线,也有许多Railscasts。
诸如map.connect :path/:link, :controller => :companies
这样简单的方法就可以使用,但是根据您现有的路由,它可能会导致一些问题,并且不是RESTful的。 如果它不会引起任何冲突,那么这将使您可以执行所要求的操作。
您可以使用:requirements选项将约束添加到路由,以缩小被认为是匹配项的范围:
map.company_link :company/:link, :requirements => { :company => /[\w\-]+/, :link => /[\w\-]+/ }
这只会匹配网址中的单词和破折号('-')字符,我相信默认路由仍将正常工作。 我还使用map.company_link
将其命名为路线,因此Rails创建了一组URL帮助器,可轻松引用您的路线: company_link_path(:company => "Bechtel", :link => "railwayproject")
如果您要坚持使用REST的方式,那就是:
map.resource :companies do |company|
company.resources :links
end
/companies/1/links/2
将被传递给使用公司和链接ID作为参数的links_controller的show动作。 前面提到的《 Rails指南》的“ 嵌套资源”部分对此做了进一步说明。 通常,您将使用:shallow => true选项,因为链接ID 2已经是唯一的,并且不需要嵌套在公司下。 嵌套路由的真正价值在于显示所有带有/companies/1/links
以及所有直接进入各个链接/links/2
其他动作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.