【问题标题】:How can I specify the order that before_filters are executed?如何指定 before_filters 的执行顺序?
【发布时间】:2011-08-08 09:09:33
【问题描述】:

rails 是否对使用以下任一用法的过滤器执行之前的顺序做出任何保证:

before_filter [:fn1, :fn2]

before_filter :fn1
before_filter :fn2

如果有任何帮助,我将不胜感激。

【问题讨论】:

    标签: ruby-on-rails before-filter


    【解决方案1】:

    如果您参考http://api.rubyonrails.org/v2.3.8/classes/ActionController/Filters/ClassMethods.html,有一个名为“过滤器链排序”的子标题,这是其中的示例代码:

    class ShoppingController < ActionController::Base
        before_filter :verify_open_shop
    
    class CheckoutController < ShoppingController
        prepend_before_filter :ensure_items_in_cart, :ensure_items_in_stock
    

    根据解释:

    CheckoutController 的过滤器链现在是 :ensure_items_in_cart, :ensure_items_in_stock, :verify_open_shop.

    所以你可以像这样明确地给出过滤器链的顺序。

    【讨论】:

    【解决方案2】:

    Rails 中的Before_filter 顺序 http://b2.broom9.com/?p=806

    过滤器链排序 http://rails.rubyonrails.org/classes/ActionController/Filters/ClassMethods.html

    如果您需要保证订单,您可以这样做:

    before_filter :fn3
    
    def fn3
      fn1
      fn2
    end
    

    【讨论】:

    • 如果两者都失败并尝试重定向,这不会导致问题吗?
    • 您可以在 fn3 中使用 if 来检查 fn1、fn2 的返回结果
    • 如果 fn1 失败(即返回 false)并且不需要执行 fn2,则必须添加更多逻辑。比如:fn1 ? fn2 : false
    【解决方案3】:

    据我所知,您放置了要执行的第一个函数,依此类推。

    所以,类似:

    before_filter :fn1, :fn2
    
    def fn1
      puts 'foo'
    end
    
    def fn2
      puts 'bar'
    end
    

    将执行fn1,然后执行fn2

    希望对您有所帮助。

    【讨论】:

    • 我正在使用 Rails 4,即使我的订单是 :fn1, :fn2,也会首先调用 :fn2。
    【解决方案4】:

    CheckoutController 的过滤器链不遵循此顺序

    :ensure_items_in_cart, :ensure_items_in_stock, :verify_open_shop
    

    应该是

    :ensure_items_in_stock, :ensure_items_in_cart, :verify_open_shop
    

    【讨论】:

      猜你喜欢
      • 2020-06-22
      • 2017-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多