Как использовать перегибы на рельсовом двигателе

Я создал движок с

rails plugin new myengine --mountable

при поиске "перегибов" в папке проекта, я нахожу /test/dummy/config/initializers/inflections.rb файл

в этом файле я положил

ActiveSupport::Inflector.inflections(:en) do |inflect|
  inflect.irregular 'singular_model', 'plural_model'
end

когда я пытаюсь использовать генератор модели (из корня проекта)

bin/rails generate model singular_model

то я получаю переход с особыми_моделями как имя таблицы и имя миграции

когда я запускаю ту же команду из myengine/test/dummy

bin/rails generate model singular_model

Я получаю результат spected: plural_model как имя таблицы и имя миграции

так, как я могу загрузить инфлектор в генератор рельсов?

Ответ 1

Фактически вы можете создать файл с именем inflections.rb в проекте _root/config/initializers/и написать свои правила в этом файле, например,

# Be sure to restart your server when you modify this file.

# Add new inflection rules using the following format. Inflections
# are locale specific, and you may define rules for as many different
# locales as you wish. All of these examples are active by default:
ActiveSupport::Inflector.inflections(:en) do |inflect|
#   inflect.plural /^(ox)$/i, '\1en'
#   inflect.singular /^(ox)en/i, '\1'
#   inflect.irregular 'person', 'people'
#   inflect.uncountable %w( fish sheep )
    inflect.irregular 'cloth', 'clothes'
end

# These inflection rules are supported but not enabled by default:
# ActiveSupport::Inflector.inflections(:en) do |inflect|
#   inflect.acronym 'RESTful'
# end

И он также применим к движку.

Надеюсь, что это поможет!

Ответ 2

В своем движке вы должны подумать о своей папке test/dummy/ в качестве корня приложения, использующего этот движок. Эта папка существует только для целей тестирования, не является настройкой для двигателя.

Скажем, ваш движок находится в папке myengine, а ваше приложение находится в папке myapp.

1) Если вам нужен пользовательский перегиб, который определяется на уровне двигателя, и он будет использоваться на движке и на уровне приложения. Тогда он должен быть определен в:

# myengine/config/initializers/inflections.rb
ActiveSupport::Inflector.inflections(:en) do |inflect|
  inflect.irregular 'singular_model', 'plural_model'
end

Да, вы должны создать папку initializers и файл inflections.rb в ней. И этот перегиб будет действителен для каждого приложения, использующего движок.

2) Если вы хотите, чтобы ваши пользовательские перегибы работали только для вашего приложения, но не для других приложений, которые используют один и тот же движок. Вы должны использовать тот же код на вашем myapp/config/initializers/inflections.rb, этот файл существует по умолчанию в приложении Rails.

В этом последнем случае область пользовательских перегибов - это только текущее приложение, как в папке test/dummy.

В зависимости от того, какое поведение вам нужно, вы должны указать код своих пользовательских флексий.

Ответ 3

В Rails 4.2 двигатели rails не загружают инициализаторы при запуске генераторов, которые обсуждаются в этой проблеме: https://github.com/rails/rails/issues/14472 p >

Обход

  • Определите перегибы в my_engine/config/initializers/inflections.rb:

    # my_engine/config/initializers/inflections.rb
    
    ActiveSupport::Inflector.inflections do |inflect|
      inflect.irregular 'regatta', 'regattas'
    end
    
  • Требовать инициализатор перетоков в engine.rb:

    # my_engine/lib/my_engine/engine.rb
    
    require_relative '../../config/initializers/inflections'
    
    module MyEngine
      class Engine < ::Rails::Engine
        # ...
      end
    end
    
  • Используйте генератор, как ожидалось: bin/rails g model Regatta