Подтвердить что ты не робот

Ruby on Rails: модули против классов

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

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

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

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

4b9b3361

Ответ 1

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

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

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

В качестве альтернативы вы можете определить его на Kernel, а затем просто назовите его в любом месте. В ядре определены методы, такие как puts.

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

my_function(4,5) # => 9

Ответ 2

Добавление методов в ядро ​​(ответ от 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, вам не понадобится.

Ответ 3

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