Ruby on Rails: модули против классов - PullRequest
19 голосов
/ 11 марта 2010

Я пытаюсь добавить функцию, которая будет доступна во всех частях моей программы. Я хочу что-то вроде:

def GlobalFunctions.my_function(x,y)
    puts x + y
end

будет доступно для всех моделей. В частности, я пытаюсь использовать функцию, подобную этой, в моем файле seed.rb, но я, скорее всего, собираюсь повторно использовать код и не хочу избыточности. Теперь я знаю, что могу сделать простой класс, но я мог бы также сделать модуль. Какие есть причины идти в любом направлении? И как только я решил, какой тип использовать, как сделать его доступным для всей программы?

Я попробовал модуль, но продолжаю получать "Ожидаемое приложение / [файл модуля] для определения [ModuleName]"

Ответы [ 3 ]

42 голосов
/ 11 марта 2010

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

module GlobalFunctions
  def self.my_function(x,y)
    puts x+y
  end
end

GlobalFunctions.my_function(4,5) # => 9

Кроме того, вы можете определить его в ядре, а затем просто вызвать его где угодно. Ядро - это место, где определены методы, такие как put.

def Kernel.my_function(x,y)
  puts x + y
end

my_function(4,5) # => 9
17 голосов
/ 02 января 2012

Добавление методов в ядро ​​(ответ от PreciousBodilyFluids) обычно считается дурным запахом и может привести к некоторым действительно трудным для поиска ошибок в больших проектах.в /lib/.

class Formatting
  def self.bold(str)
    return "<strong>#{str}</strong>"
  end
end

Затем вы можете:

require 'formatting'
puts Formatting.bold("text")

или

require 'formatting'
include Formatting

puts bold("text")

Это будет понятно всем, кто придет к коду позжечто вы используете тоже.Если вы используете Rails, вам не понадобится require.

2 голосов
/ 11 марта 2010

PreciousBodilyFluids является правильным, и если это GlobalFunctions является частью проекта RoR, вы можете назвать файл global_functions.rb и поместить его в каталог lib/, чтобы избежать сообщения об ошибке, которое вы разместили на конец вашего вопроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...