实际上,我怎样才能从 Rails 中的控制器调用控制器?

How can I, in effect, call a controller from a controller in Rails?

好吧,好吧,从表面上看,这似乎是一个非常糟糕的主意,而且大多数时候确实如此。它不是 MVC,它会产生潜在的奇怪依赖关系,并且没有遵循良好的逻辑关注点分离。

现在让我解释一下导致我提出这个问题的情况。我们有第三方 api。出于性能原因,我们必须将其缓存很长时间。有时他们改变了他们的数据,我们需要立即反映出来。我们给了他们一个 api 端点来清除缓存(因为出于各种原因,我们不打算让他们访问我们的内部缓存)。我需要一些方法来重新加热缓存。重新启动他们的 api 电话很容易。但是,我们有依赖于该数据的视图片段缓存,我也想重新加热它们。

基本上我想缓存在第二个控制器上调用期间通常会缓存的所有内容。但是,尝试这样做会导致第二次控制器调用超时。有没有一种方法可以实现这一点,或者有一种替代方法可以缓存所有必要的元素(包括使用 rails 片段缓存的视图元素)?

看来您真正的问题是破坏片段缓存。为什么不只使用一个自我破坏的缓存键。如果您使用 cache 'key' do... 缓存视图的一部分,那么 "key" 字符串可能会被模型或诸如 Post.count 之类的东西更新。例如,在 API 控制器中将 Post 的列表缓存为 JSON 列表:

# your api controller's index action
@post_json = Rails.cache.fetch "posts-#{Post.count}-#{Post.order(:updated_at).last.updated_at}" do
  Post.all.to_json
end

现在您已经缓存了 post 的集合并准备好作为 API 响应发送,并且您使用的是自毁缓存键,您不必担心手动 "rewarming" 您的缓存。每当创建新的 Post 或更新缓存键时,缓存键都会不同,因为 countupdated_at(对于最近更新的 post)将不同并导致Rails.cache.fetch 方法来执行块,重新加热缓存。

使用这种动态缓存键,您可以使用任何不需要调用控制器的方法来更新它(这非常困难,不推荐)。

要解决 Rails 维护单个连接的问题,您可以使用多线程方法:

Thread.new do
    # do stuff here
end