Rails模块未为演示者加载

问题描述 投票:0回答:1

为什么在我的presenter类中包含模块后,为什么我的模块无法正确加载?

我的类方法和模块方法从rails加载时不可用。从单个文件中的轨道加载时,该模块可以工作。

app / presenters / body_parts / method_wrapper.rb

module BodyParts
  def self.included(klass)
    klass.extend ClassMethods  # => Car
  end                          # => :included
  module ClassMethods

    def set_wheels(*args)
      x, *wheel_args = args                              # => [3],  [3]
      puts "Wheels class method called with: #{x.to_s}"  # => nil,  nil
      @wheels |= x                                       # => true, true
    end                                                  # => :set_wheels

    class MethodWrapper
      attr_reader :klass  # => nil

      def initialize(klass)
        @klass = klass
      end                    # => :initialize

      def wrap(method_name)
        puts "Wrapping a method"
        wrapper_callback(result)
      end                         # => :wrap
    end                           # => :wrap
  end                             # => :wrap

  private  # => BodyParts


  def wrapper_callback(result)
    "Wrapped a #{result} in the call back"
  end                                       # => :wrapper_callback

end  # => :wrapper_callback

app / presenters / car_presenter.rb

class CarPresenter
  include BodyParts  # => Car
  set_wheels 3       # => true

  def brand
    'Car Brand'  # => "Car Brand"
  end            # => :brand

  set_wheels 3  # => true

  def title          # policy set to 2 for title methods because of the above
    'Car Title'
  end            # => :title
end              # => :title

car_presenter = CarPresenter.new  # => #<CarPresenter:0x00fe4ed9300>
car_presenter.brand      # => "Car Brand"

# >> Wheels class method called with: 3
# >> Wheels class method called with: 3

[Binding.pry from Rails中的CarsPresenter

[1] pry(CarPresenter)> set_wheels 3
NameError: undefined local variable or method `set_wheels' for CarPresenter:Class
from (pry):12:in `<class:CarPresenter>'
[2] pry(CarPresenter)> BodyParts
=> BodyParts
[3] pry(CarPresenter)> self
=> CarPresenter
ruby-on-rails ruby ruby-on-rails-5
1个回答
0
投票

由于const加载在rails中的工作方式,应该在BodyParts目录的顶层,即presenters中定义模块app/presenters/body_parts.rb.rb

Rails期望app/presenters/body_parts/method_wrapper.rb定义常量BodyParts::MethodWrapper

读取模式in rails guides

© www.soinside.com 2019 - 2024. All rights reserved.