2016-11-02 3 views
0

Кажется, я не совсем понимаю инициализацию или использование класса внутри другого класса.Неопределенный метод для класса - Sinatra

У меня есть приложение Синатры и создал класс для обработки выборки данных из апи

# path: ./lib/api/bikes/bike_check 
class BikeCheck 
    def self.check_frame_number(argument) 
    # logic here 
    end 
end 
BikeCheck.new 

то у меня есть еще один класс, который должен потреблять/использовать метод check_frame_number

require 'slack-ruby-bot' 
# Class that calls BikeCheck api 
require './lib/api/bikes/bike_check' 

class BikeCommands < SlackRubyBot::Bot 
    match /^Is this bike stolen (?<frame_number>\w*)\?$/ do |client, data, match| 
    check_frame_number(match[:frame_number]) 
    client.say(channel: data.channel, text: @message) 
    end 
end 
BikeCommands.run 

Когда check_frame_number называется i получить ошибку undefined method. То, что я хотел бы знать, - это то, что основная вещь я не делаю/понимаю, подумал я, требуя, чтобы файл, который имеет класс, он будет доступен для использования.

Любая помощь приветствуется

Благодаря

ответ

1

Нет, вы не можете требовать метод, определенный в классе - методы, определенные в классе доступны только для класса, экземпляры класса и в наследство.

Способ смешивания возможен только с включением модулей.

Для решения вы выдаете вы можете либо сделать

class BikeCommands < SlackRubyBot::Bot 
    match /^Is this bike stolen (?<frame_number>\w*)\?$/ do |client, data, match| 
    BikeCheck.check_frame_number(match[:frame_number]) # <=========== 
    client.say(channel: data.channel, text: @message) 
    end 
end 

или написать модуль с методом и include/extend в классе, вы хотите, чтобы метод был доступен в.

+0

спасибо за очистку, что вверх. Есть ли предпочтительный способ, так что модуль или вызов класса, как вы указали? – Richlewis

+0

Обычно это зависит от ситуации, я использую и то, и другое. Но здесь, если вы определили 'BikeCheck' только для того, чтобы содержать метод, который вы хотите использовать в' BikeCommands', он определенно квалифицируется как случай использования модуля вместо этого. –

+0

еще раз спасибо, когда inlcuding/extension я могу просто вызвать метод по имени тогда? – Richlewis

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