0

我有一个使用应用程序范围的 slug 的应用程序(使用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

这在开发中完美运行:

路线在开发中运行良好

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

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

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

4

1 回答 1

1

解决它!

有一种叫做“ 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

在模型文件夹中添加一个新的观察者类:

#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

其工作方式是在运行原始函数后调用这些附加函数。这使我的应用程序可以独立于相关模型运行功能,从而正确更新路线。

于 2013-10-02T20:05:25.993 回答