我有一种情况,我正在标题类别。我需要在所有大写字母中包含HR和ISO等首字母缩写词。
我目前正在使用
在inflections初始化程序中执行此操作 ActiveSupport::Inflector.inflections(:en) do |inflect|
inflect.acronym 'HR'
inflect.acronym 'ISO'
end
但是,据我所知,异常需要硬连线到代码中。有没有办法让初始化程序读取表格?这样,用户可以动态添加首字母缩写词例外。
答案 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。这对你的情况来说可能是太多的开销,但我发现你的问题很有趣,所以我认为我会解决这个问题。