Ruby On Rails更新Heroku动态路由

我有一个应用程序使用应用程序范围的slugs(使用Slugalicious gem与Sluggable表),并使用此代码路由到这些slug:

#Slugs begin Slug.all.each do |s| begin get "#{s.slug}" => "#{s.sluggable_type.downcase.pluralize}#show", :id => s.slug rescue end end rescue end 

我使用以下代码更新slugs模型时,我目前更新路线:

 after_save :update_routes def update_routes Rails.application.reload_routes! end 

这在dev中非常有效:

路线在开发中运作良好

我得到的问题是,如果我更新或创建一个新的slug,Heroku不会更新以适应它。 它在开发中工作,并且(令人困惑),如果我在Heroku上执行“heroku run rake routes”,它就可以工作。 但是,如果我尝试浏览到新url,该应用只会显示404。 如果我重新部署应用程序,所有路由都可以工作,这让我相信这与更新应用程序范围内的路由有关

这个问题说它与在Heroku上运行多个进程有关,但我还没有找到它。

有任何想法吗? 提前谢谢了

固定它!

有一种称为“ ActiveRecord Observer ”的东西,自Rails 4.0以来已被折旧。 我发现这个网站解释了我想做什么,但它有点过时了。 我已经在下面的rails 4.0代码中包含了:

如果您使用的是Rails 4,请使用rails-observers gem

将调用添加到您的环境文件

 #config/application.rb (can be placed into dev or prod files if required) config.active_record.observers = :slug_observer 

将新的观察者类添加到models文件夹中:

 #app/models/slug_observer.rb class SlugObserver < ActiveRecord::Observer def after_save(slug) Rails.application.reload_routes! slug.logger.info("Routes Reloaded") end def after_destroy(slug) Rails.application.reload_routes! slug.logger.info("Routes Reloaded") end end 

这种方法的工作方式是在原始运行后调用这些螺栓固定function。 这允许我的应用程序操作所讨论的模型独立的function,从而正确更新路由。