bogdan_uman
@bogdan_uman
шлЫмазл неукЪ-поцЪ

Телеграм бот, как правильно разделить на модули?

Здравствуйте. Подскажите пожалуйста, как правильно сделать, использую гем telegram-bot. И вот у меня уже основний файлик разросся , и вот решил я часть кода скинуть в модуль

/app/controllers/elegram/webhook_controller.rb
class Telegram::WebhookController < Telegram::Bot::UpdatesController
  include Telegram::Bot::UpdatesController::CallbackQueryContext
  include Telegram::Bot::UpdatesController::MessageContext
  include NotificationsAdditional

  use_session!
  context_to_action!
  before_action :set_locale

  include TelegramAddNotification
 ....


app/controllers/concerns/telegram_add_notification.rb
module TelegramAddNotification
  def new_currency_pair
    markup = setup_button([[button_cancel_title]])
    respond_with :message, text: I18n.t(:ask_enter_pair), reply_markup: markup
    save_context :new_currency_pair
  end

  context_handler :new_currency_pair do |*args|
   ...
  end


И при запуске бота, сразу вылетает ошибка,
NoMethodError: undefined method `context_handler' for TelegramAddNotification:Module
/coins/app/controllers/concerns/telegram_add_notification.rb:10:in `<module:TelegramAddNotification>'
/coins/app/controllers/concerns/telegram_add_notification.rb:3:in `<main>'
/coins/gems/gems/bootsnap-1.3.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:100:in `load'
/coins/gems/gems/bootsnap-1.3.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:100:in `load'


Не подскажите как правильно его разделить на модуля? Спасибо.
  • Вопрос задан
  • 256 просмотров
Решения вопроса 1
@printercu
В новой версии 0.14 `context_handler` удален, и таких ситуаций не будет. Несмотря на это, такая ситуация довольно частая, и может возникнуть как в контроллере с методами `before_action, helper_method`, так и в моделях, например c методами `validates, scope, ...`

`context_handler` это метод класса, и он доступен только в контроллере бота, он не определен для любого модуля руби. Тут нужно поправить код так, чтобы `context_handler` был вызван у контроллер, когда TelegramAddNotification будет инклужен. В руби для этого есть `Module#included`, в рельсах используется модуль api.rubyonrails.org/classes/ActiveSupport/Concern.html (рекомендую прочитать описание и исходный код) , который расширяет возможности `.included`.

module TelegramAddNotification
  extend ActiveSupport::Concern

  included do
    context_handler ...
  end
end
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@vortx
IT-инженер, Web-разработчик, MicroChip-dev
Положите свой кусочек в папку lib и проверьте чтоб lib попадал в config.autoload_paths и цепляйте его через require ". /lib/ваш фаил".
require 'file' in Lib тоже вариант
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы