当前位置:  开发笔记 > 后端 > 正文

在Rails中动态重新加载路由是一个坏主意吗?

如何解决《在Rails中动态重新加载路由是一个坏主意吗?》经验,为你挑选了2个好方法。

我有一个应用程序,我正在编写,我允许管理员为页面,类别等添加别名,我想使用不同的控制器/操作取决于别名(没有重定向,我发现渲染实际上并没有调用方法.我只是渲染模板).我已尝试捕获所有路由,但我并不是因为导致并捕获每次都抛出的DoubleRender异常而感到疯狂.

我提出的解决方案是在服务器启动时动态生成的路由,并在创建/更新/销毁别名时使用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的最佳做法吗?有更好的解决方案吗?



1> mjnissim..:

本,

我发现你已经使用的方法是最好的.使用Rails 3,您必须稍微更改代码,以:

MyNewApplication::Application.reload_routes!

就这样.


`Rails.application.reload_routes!`同样有效,不要求你使用应用程序的名称(对我来说很有用,可以构建模板应用程序).
请注意:我相信如果你正在运行多个进程(比如在Heroku上),你必须在每个进程上运行它,所以如果你在after_create或after_destroy挂钩中调用它,其他进程将不会重新加载它们的路由.

2> Patrick McKe..:

快速解决方案

在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的栏时,你不会扫描该文件,除非你明确指定它.

容错:检查以确保有人不会在现有路由上意外混淆.您可以通过将所有别名强制转换为"目录"来实现这一点,该目录已知为无法路由(在这种情况下,别名在文本上是唯一的,足以确保它们永远不会发生冲突),但这不是最理想的我能想到的一些应用程序的解决方案.

推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有