Глобальная функция Rails доступна всем объектам - PullRequest
0 голосов
/ 22 марта 2019

Я бы хотел создать функцию current_order_week, которая была бы доступна во всем моем приложении и могла бы вызываться аналогично чему-то вроде current_user.Я не хочу иметь include в конкретной модели / контроллере, я просто хочу, чтобы он был доступен везде.

Я изменил папку /lib, добавив в нее файл lib_extensions.rb, и добавилк этому файлу:

class Object
    def current_order_week
    end
end

Я изменил свой application.rb, включив в него:

config.autoload_paths << Rails.root.join('lib')
config.eager_load_paths << Rails.root.join('lib')

Но когда я пытаюсь вызвать current_order_week с консоли или из теста,Я до сих пор вижу:

NameError: undefined local variable or method 'current_order_week' for main:Object

Что еще мне нужно сделать?

Ответы [ 3 ]

1 голос
/ 22 марта 2019

Вы должны добавить эту функцию в файл application_helper.rb.Все контроллеры простираются от ApplicationController, а ApplicationController включает ApplicationHelper.

module ApplicationHelper
  def current_order_week
  end
end

Это будет доступно для использования в представлениях и контроллерах

0 голосов
/ 22 марта 2019

autoload_paths и eager_load_paths не включают модули, они только require файлы, в которых определены модули.Чтобы использовать current_order_week, вам необходимо указать имя модуля:

module Foo
  def current_order_week
    .
    .
    .
  end
end

Foo.current_order_week()

Чтобы использовать current_order_week без добавления к нему имени модуля, вам необходимо включить Foo внутриконтроллеры и модели:

class ApplicationController < ActionController::Base
  include Foo

  def some_action
    current_order_week()
  end
end

class ApplicationRecord < ActiveRecord::Base
  include Foo
end
0 голосов
/ 22 марта 2019

Основные классы для исправления обезьян, такие как Object, обычно не очень хорошая идея, это может помешать некоторым драгоценным камням и т. Д. И в целом может привести к болезненной отладке в будущем.

Если вы абсолютно хотите это сделать - автозагрузка не заберет Object из lib, поскольку она уже определена. Создайте инициализатор в config/initializers, затем он будет загружен, но не будет перезагружаться при изменениях кода.

Но лучше использовать такой код в ApplicationHelper, ApplicationRecord и ApplicationController

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