2012-03-22 5 views
1

я добавил варианты в application.rb:Автозагрузка функция из Lib папки

config.autoload_paths += %W(#{config.root}/lib) 
config.autoload_paths += Dir["#{config.root}/lib/**/"] 

и Lib \ functions.rb:

def some_lib 
    return "#######################################" 
end 

В контроллере я пытаюсь вызвать эту функцию, но получите ошибку:

undefined local variable or method `some_lib' for #<TodosController:0x49a3850> 

Как это исправить?

ответ

2

Для того чтобы иметь автопогрузку с рельсами lib, вам необходимо следовать правилам именования направляющих.

Библиотека/functions.rb

class Functions 
    def self.some_lib 
    return "#######################################" 
    end 
end 

Тогда вы можете Functions.some_lib

Или

Библиотека/functions.rb

module Functions 
    def some_lib 
    return "#######################################" 
    end 
end 

Затем include Functions, где вам нужны ваши методы. Это позволяет выполнять:

some_lib

0

Да, в принципе, не делают этого, рубин является языком OO, вы пытаетесь сделать процедурный язык.

Есть какой-то способ сделать так, чтобы вы делали именно то, что вы просите, включая смешивание новых методов в ядре или объекте ... но это действительно не то, что вы хотите сделать.

Вы хотите добавить этот новый метод ко всем контроллерам, а не обязательно в другие места? Затем просто добавьте его в свой ApplicationController (./app/controllers/application_controller.rb). Или добавьте его в модуль в ./lib, а затем включите MyControllerFunctions в ApplicationController.

Вы действительно хотите использовать его в любом месте? Затем я сделаю то, что предлагает Кайл, сделайте его модульным методом и назовите его как MyFunctions.some_method.

Ruby позволит вам сделать что угодно, вы можете может сделать так, чтобы он вызывался так, как вы хотите, из любого класса ... но на самом деле вы этого не хотите, это просто приведет к беспорядок.

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