【问题标题】:unexpected filter behavior in rails streaming controlleRails 流控制器中的意外过滤器行为
【发布时间】:2016-01-25 23:56:13
【问题描述】:

Ruby on Rails 3: Streaming data through Rails to client 中所示的流式传输时,我遇到了 after_filter 和 around_filter 在响应之前完成执行的问题。我需要在执行 after_filters 之前流式传输响应,因为我们依赖于在这些过滤器中清理的数据。我正在使用乘客。

示例控制器:

class Asdf
  def each
    (1..5).each do |num|
      sleep(1)
      Rails.logger.info "STREAMING LINE #{num}"
      yield "test#{num}\n"
    end
  end
end

class WelcomeController < ApplicationController
  before_filter :before
  after_filter :after

  around_filter do |controller, action|
    logger.debug "around_filter prior to action"
    action.call
    logger.debug "around_filter after action"
  end

  def index
    self.response.headers['Last-Modified'] = Time.now.to_s

    self.response_body = Asdf.new                                                  
  end

  def before
    Rails.logger.info "before_filter called"
  end

  def after
    Rails.logger.info "after_filter called"
  end

end

示例日志输出(时间反映它正在流式传输)

Started GET "/welcome/index" for 192.168.74.64 at 2016-01-25 17:28:17 -0600
Processing by WelcomeController#index as HTML
before_filter called
around_filter prior to action
around_filter after action
after_filter called
Completed 200 OK in 0.7ms (ActiveRecord: 0.0ms)
STREAMING LINE 1
STREAMING LINE 2
STREAMING LINE 3
STREAMING LINE 4
STREAMING LINE 5

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3.2


    【解决方案1】:

    看起来,与其依赖around_filter,不如在迭代器耗尽后,您可以在类的each 方法中调用数据清理例程:

    class Asdf
      def each
        (1..5).each do |num|
          sleep(1)
          Rails.logger.info "STREAMING LINE #{num}"
          yield "test#{num}\n"
        end
        Rails.logger.info "ALL DONE; READY TO CLEAN UP"
        clean_up
      end
    
      def clean_up
        Rails.logger.info "CLEANING UP"
      end
    end
    

    在 Rails 3.2 应用程序中点击 welcome#index 操作会在日志中产生以下内容:

    Started GET "/welcome" for 127.0.0.1 at 2016-01-25 18:55:49 -0800
    Processing by WelcomeController#index as HTML
    before_filter called
    around_filter prior to action
    around_filter after action
    after_filter called
    Completed 200 OK in 0.5ms (ActiveRecord: 0.0ms)
    STREAMING LINE 1
    STREAMING LINE 2
    STREAMING LINE 3
    STREAMING LINE 4
    STREAMING LINE 5
    ALL DONE; READY TO CLEAN UP
    CLEANING UP
    

    【讨论】:

    • 谢谢@konacaret。我想避免这种情况,因为我的其他非流媒体方法目前正在使用 railties 中的过滤器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多