我提出的解决方案是在服务器启动时动态生成的路由,并在创建/更新/销毁别名时使用Alias模型的回调来重新加载路由.
这是我的routes.rb中的代码:
Alias.find(:all).each do |alias_to_add| map.connect alias_to_add.name,:controller => alias_to_add.page_type.controller,:action => alias_to_add.page_type.action,:navigation_node_id => alias_to_add.navigation_node.id end
我在Alias模型中使用回调如下:
after_save :rebuild_routes after_destroy :rebuild_routes def rebuild_routes ActionController::Routing::Routes.reload! end
这是针对Rails的最佳做法吗?有更好的解决方案吗?
解决方法
在routes.rb的底部有一个包罗万象的路线.在路由路由的操作中实现所需的任何别名查找逻辑.
在我的实现中,我有一个表,它将定义的URL映射到控制器,操作和参数哈希.我只是将它们从数据库中取出,然后调用相应的操作,然后尝试为该操作呈现默认模板.如果动作已经呈现了某些内容,则抛出DoubleRenderError,我抓住并忽略它.
您可以将此技术扩展为您想要的复杂功能,尽管随着它变得越来越复杂,通过调整路由或Rails默认路由逻辑来实现它更有意义,而不是通过自己重新实现所有路由逻辑.
如果找不到别名,则可以根据需要抛出404或500错误.
记住的东西:
缓存:不知道您的URL先验可以使页面缓存成为绝对的熊.请记住,它基于提供的URI而不是url_for(:action_you_actually_executed)进行缓存.这意味着如果你别名
/foo_action/bar_method
至
/some-wonderful-alias
你会在缓存目录中找到一些精彩的alias.html.当你试图扫描foo的栏时,你不会扫描该文件,除非你明确指定它.
容错:检查以确保有人不会在现有路由上意外混淆.你可以通过强制所有别名进入一个已知不会路由的“目录”来做到这一点(在这种情况下,别名在文本上是唯一的,足以确保它们永远不会发生碰撞),但这不是最理想的我能想到的一些应用程序的解决方案.
原文地址:https://www.jb51.cc/ruby/269360.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。