2014-02-12 3 views
0

У меня есть модуль в app/misc/dsl/builder.rb, который имеет этот кодRails 4: Неопределенный метод на модуле

module Dsl 
    class Builder 
    def initialize(context, &block) 
     return if not block_given? 

     parent_context = block.binding.eval "self" 
     parent_context.extend Proxy 
     parent_context.object = context 

     parent_context.instance_eval &block 
    end 
    end 

    def self.set_context(context, &block) 
    Dsl::Builder.new(context, &block) 
    end 
end 

Примечание: этот каталог misc поджат в application.rb

config.autoload_paths += Dir[Rails.root.join('app', 'models', '{**/}'), 
    Rails.root.join('app', 'misc', '{**/}') 
] 

Затем, где-то в тексте (скажем, на foo.rb) У меня есть этот код:

Dsl.set_context(obj) do 
    #some code with obj receiving messages 
end 

Используемый тестовый стек состоит из Zeus + Guard + Rspec. Теперь, позволяет сказать, что я переписать код, чтобы что-то не работает

Dsl.set_context(obj) do 
    asdqwe #this message does not exists 
end 

Со времен до времени, я получаю это озадачивает сообщение

1) SomeOtherClass search_hash receiving keywords params should query for those keywords 
    Failure/Error: subject.search_hash 
    NoMethodError: 
     undefined method `set_context' for Dsl:Module 
    # ./app/misc/product_query.rb:116:in `base_search_hash' 
    # ./app/misc/product_query.rb:25:in `search_hash' 
    # ./spec/misc/product_query_spec.rb:78:in `block (4 levels) in <top (required)>' 
    # -e:1:in `<main>' 

вместо правильного сообщения, которое должно быть в отношении undefined method asdqwe

Есть ли какие-нибудь подсказки об этом?

+0

вы перезапустите сервер? мотыга вы предварительно загружаете в application.rb? похоже, что это не груз. вы могли бы попробовать приложение «requrie»/misc/dsl/builder.rb''? – lalo

+0

@lalo только что обновил вопрос. Я попробовал 'require_relative 'app/misc/dsl/builder.rb'', а затем да, он загружается. Это проблема загрузки, но не может понять, что происходит. – geekazoid

ответ

1

Look here

он говорит:

Rails 3 был обновлен таким образом, что классы/модули (в дальнейшем, C/M) ленивы загружены из путей автозагрузки, поскольку они необходимы

так что вы можете сделать require_relative 'app/misc/dsl/builder.rb' в своем rspec_helper.rb (может быть лучше всего с require?) Проблема заключается в том, что загрузчик не знает заранее w здесь, чтобы найти Dsl.set_context, но он будет знать, как только вы ссылку Dsl::Builder

Надеется, что это помогает

Смежные вопросы