Ruby получает неопределенную ошибку метода, и я не уверен, полностью ли я понимаю, как методы работают для моего плагина - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь создать плагин для Discourse, который написан на Ruby.Как обычные пустые файлы, моя программа работает идеально и без ошибок, но когда я пытаюсь адаптировать свой код в контексте плагина, я сталкиваюсь с проблемами, и я не уверен, действительно ли я понимаю, как должна быть задумана вся идея с функциями.Я подумал, что было бы разумно иметь больше, чем один файл, передавать функции другим способом и требовать их в виде «основного» файла.Например, получение твитов - это один из методов в дополнительном файле, отправка твитов другим методом в другом файле.В чистом ruby-коде он работает нормально, но когда я пытаюсь интегрировать это в структуру файла плагина, я получаю ошибку

undefined method `my_method' for #<Plugin::Instance:0x00007f9004012fc0> (NoMethodError)

, файлы с методами находятся в каталоге lib и "главном" файле, которыйназывается plugin.rb находится в основной папке

, поэтому я попытался

require_relative 'lib/my_method'

и наоборот

require_relative File.expand_path('../lib/my_method.rb', __FILE__)

, но я все еще сталкиваюсь с этой ошибкой.

Я не определил какие-либо классы или модули или что-то в этом роде, поэтому «файлы методов» буквально начинаются с

def self.my_method

    #my code here
    end 

Может ли это быть причиной того, что я столкнулся с ошибкойвыше?Почему он работает как пустой код ruby, а не когда я пытаюсь запустить плагин с rails s на моем экземпляре дискурса?Я все еще довольно новичок в программировании на ruby, поэтому, возможно, мой вопрос кажется немного глупым.

Вот ссылка, которая привела меня к созданию плагина:

https://meta.discourse.org/t/beginners-guide-to-creating-discourse-plugins-part-1/30515

1 Ответ

0 голосов
/ 10 декабря 2018

К сожалению, ваше понимание методов поверхностно.По сути, любой метод, который вы объявляете в глобальной области видимости, добавляется в класс Object как частный метод, поэтому он доступен везде в ваших объектах, поскольку они являются производными от класса Object и в глобальной области видимости, поскольку это область действия класса Object.Если вы объявляете метод как self.method, вы делаете его методом main Object, потому что self ссылается на main, что не является желаемым для вас поведением.Чтобы решить эту проблему, вы должны просто удалить self и написать его так:

def my_method
end

Таким образом, этот метод будет добавлен к самому классу Object, а не к основному Object.На статью о методах в целом есть ссылка .И еще один один в поведении области верхнего уровня.В этом коде вы можете наблюдать разницу.Кроме того, вам может быть полезно изучить Ruby перед тем, как продолжить разработку.Я предлагаю rubymonk .Другая проблема - ваши файлы с одним методом, что не является наилучшей практикой для организации кода ruby.Ruby - это действительно объектно-ориентированный язык, и если вам нужен набор или даже один метод общего назначения, лучше поместить его в модуль или класс, чтобы определить его назначение и роль в приложении, сделать его многоразовым и отслеживаемым беззагрязнение глобального масштаба.

...