我有一个使用应用程序范围的 slugs 的应用程序(使用懒惰的宝石 https://github.com/RISCfuture/slugalicious与 Sluggable 表),并使用以下代码路由到这些 slugs:
#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
这在开发中完美运行:
我遇到的问题是,如果我更新或创建新的 slug,Heroku 不会更新以适应它。它在开发中工作,并且(令人困惑),如果我在 Heroku 上执行“heroku run rake paths”,它就会工作。但如果我尝试浏览新的 URL,该应用程序只会显示 404。如果我重新部署应用程序,所有路线都可以工作,这让我相信这与更新应用程序范围内的路线有关
这个问题 https://stackoverflow.com/questions/129510/is-it-a-bad-idea-to-reload-routes-dynamically-in-rails说这与在 Heroku 上运行多个进程有关,但我还没有找到这一点。
有任何想法吗?提前谢谢了
修复!
有一种东西叫做“ActiveRecord观察者 http://apidock.com/rails/ActiveRecord/Observer“自Rails 4.0以来已经贬值了。我发现这个网站 http://eveloverails.wordpress.com/2010/10/09/create-multiple-routes-on-ruby/这解释了我想做的事情,但它有点过时了。我在下面包含了 Rails 4.0 的代码:
如果您使用的是 Rails 4,请使用Rails 观察者宝石 https://github.com/rails/rails-observers
将调用添加到您的环境文件中:
#config/application.rb (can be placed into dev or prod files if required)
config.active_record.observers = :slug_observer
添加新的观察者类进入你的模型文件夹:
#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
其工作方式是在原始函数运行后调用这些附加函数。这使得我的应用程序能够独立于相关模型来操作该功能,从而正确更新路线。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)