是否可以在 Ruby 中执行 before_action(就像在 Rails 中一样)?

2024-02-14

是否可以致电before_action在某些指定的方法之前,比如在 Rails 中?

class Calculator
  before_action { raise Exception, "calculator is empty" if @numbers.nil? }, 
                 only: [:plus, :minus, :divide, :times]

  def push number
    @numbers ||= [] 
    @numbers << number
  end

  def plus
    # ... 
  end

  def minus
    # ... 
  end

  def divide
    # ... 
  end

  def times
    # ... 
  end

    # ... 
end

可以用纯 Ruby 来完成!一种方法是使用方法别名 http://apidock.com/ruby/Module/alias_method

class Foo
  def bar
    #true bar
  end

  alias_method :original_bar, :bar

  def bar
    before_stuff
    original_bar
    after_stuff
  end
end

但对于更通用的方法,你可以阅读这个线程 https://stackoverflow.com/questions/5513558/executing-code-for-every-method-call-in-a-ruby-module.

您的代码示例可以是:

class Calculator

    def plus
      # ...
    end

    def end
      # ...
    end

    def divide
      # ...
    end

    def times
      # ...
    end

    [:plus, :minus, :divide, :times].each do |m|
      alias_method "original_#{m.to_s}".to_sym, m

      define_method m do
        check_numbers
        send("original_#{m.to_s}".to_sym)
      end
    end

    private

    def check_numbers
      raise Exception, "calculator is empty" if @numbers.nil? 
    end
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以在 Ruby 中执行 before_action(就像在 Rails 中一样)? 的相关文章

随机推荐