rails中的inflect.acronym语句可以是动态的。即基于表格,而不是代码中的硬连线?

时间:2016-03-21 14:12:41

标签: ruby-on-rails

我有一种情况,我正在标题类别。我需要在所有大写字母中包含HR和ISO等首字母缩写词。

我目前正在使用

在inflections初始化程序中执行此操作
 ActiveSupport::Inflector.inflections(:en) do |inflect|
   inflect.acronym 'HR'
   inflect.acronym 'ISO'
 end

但是,据我所知,异常需要硬连线到代码中。有没有办法让初始化程序读取表格?这样,用户可以动态添加首字母缩写词例外。

2 个答案:

答案 0 :(得分:2)

初始化程序仍然只在应用程序重启时运行,因此“动态”向表中添加记录不会自动添加到您的变形中。

但你可以试试......

class MyInflection < ActiveRecord::Base
  after_save :add_inflection

  def add_inflection
    ActiveSupport::Inflector.inflections(:en) {|i| i.acronym my_acronym }
  end
end

这假设您有一个模型MyInflection,表“my_inflections”,其属性为“my_acronym”

要在重新启动时加载现有的变形,请将初始化程序设置为...

 ActiveSupport::Inflector.inflections(:en) do |inflect|
  if defined?(MyInflection)
    MyInflection.all.each { |i| inflect.acronym i.my_acronym }
  end
 end

defined?的测试是为了防止在未定义表(新数据库或尚未迁移)时出现错误

答案 1 :(得分:1)

如果我有一个像这样的普通旧Ruby对象:

  class MyInflector
    class << self
      def new_inflection(i)
        ActiveSupport::Inflector.inflections(:en) do |inflect|
          inflect.acronym i
        end
      end
    end
  end

我启动IRB,然后我可以这样做:

  irb(main):001:0> class MyInflector
  irb(main):002:1>   class << self
  irb(main):003:2>     def new_inflection(i)
  irb(main):004:3>       ActiveSupport::Inflector.inflections(:en) do |inflect|
  irb(main):005:4*         inflect.acronym i
  irb(main):006:4>       end
  irb(main):007:3>     end
  irb(main):008:2>   end
  irb(main):009:1> end
  => :new_inflection

  irb(main):010:0> "hr".titleize
  => "Hr"

  irb(main):011:0> MyInflector.new_inflection("HR")
  => /HR/

  irb(main):012:0> "hr".titleize
  => "HR"

通过此操作,您可以创建一个视图,让用户定义新的变形。我想在与所述视图相关联的控制器中,您将同时处理新拐点的持久性和加载,如上所述。

在稍后重新启动时,可以根据SteveTurczyn加载持久变形。但是,我相信这允许您定义变形而无需重新启动。

我认为这是你的想法?

更新:

在更仔细地阅读SteveTurczyn的帖子时,我没有做任何与他有所不同的事情。他以不同的方式组织它,我的眼睛错过了ActiveSupport :: Inflector调用。所以,如果其中任何一个满足您的需求,请接受他的回答。向史蒂夫道歉。

另一个非常小的和纯粹风格的差异(也许是显而易见的)。最近,我一直试图将所有非持久性逻辑保留在我的AR模型之外。这就是我采用PORO方法的原因。我也一直试图保持我的控制器超级瘦。所以,事实上,我可能会有另一个位于控制器,MyInflector和Steve的MyInflection之间的PORO。这对你的情况来说可能是太多的开销,但我发现你的问题很有趣,所以我认为我会解决这个问题。