【问题标题】:how to use inflections on a rails engine如何在 Rails 引擎上使用屈折变化
【发布时间】:2015-09-08 05:31:55
【问题描述】:

我用

创建了一个引擎
rails plugin new myengine --mountable

在项目文件夹中搜索“inflections”时,我发现 /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

然后我得到一个以 singular_models 作为表名和迁移名的迁移

当我从 myengine/test/dummy 运行相同的命令时

bin/rails generate model singular_model

我得到了预期的结果:plural_model 作为表名和迁移名

那么,如何将变形器加载到轨道生成器中?

【问题讨论】:

标签: ruby-on-rails ruby-on-rails-4


【解决方案1】:

在 Rails 4.2 中,rails 引擎在运行生成器时不会加载初始化程序,本期讨论了这一点:https://github.com/rails/rails/issues/14472

解决方法

  1. my_engine/config/initializers/inflections.rb 中定义变形:

    # my_engine/config/initializers/inflections.rb
    
    ActiveSupport::Inflector.inflections do |inflect|
      inflect.irregular 'regatta', 'regattas'
    end
    
  2. 需要engine.rb 中的屈折初始化器:

    # my_engine/lib/my_engine/engine.rb
    
    require_relative '../../config/initializers/inflections'
    
    module MyEngine
      class Engine < ::Rails::Engine
        # ...
      end
    end
    
  3. 按预期使用生成器:bin/rails g model Regatta

【讨论】:

    【解决方案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】:

      您实际上可以在项目 _root/config/initializers/ 中创建一个名为 inflections.rb 的文件,并将您的规则写入该文件中,例如,

      # 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
      

      它也适用于引擎。

      希望对你有帮助!

      【讨论】:

      • @DineshSaini 请再读一遍这个问题。我认为你并没有真正理解这个问题
      • 这行得通吗?我遇到了同样的问题,我的引擎忽略了额外的屈折初始化程序。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-01
      • 1970-01-01
      • 2014-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多