我有一种情况,我是命名类别。我需要有缩写词,如人力资源和ISO在所有的大写。
目前,我正在使用以下方法在调谐器初始化器中执行此操作
ActiveSupport::Inflector.inflections(:en) do |inflect|
inflect.acronym 'HR'
inflect.acronym 'ISO'
end然而,据我所知,异常需要硬连接到代码中。有什么方法可以让初始化器读取表吗?这样,用户就可以动态添加缩略词异常。
发布于 2016-03-21 14:31:23
初始化程序仍然只会在应用程序重新启动时运行,因此将记录添加到表“动态”不会自动添加到您的变化。
但你可以试试..。
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
enddefined?的测试是在尚未定义表(新数据库或尚未迁移)时防止错误。
发布于 2016-03-21 14:59:11
如果我有这样一个普通的旧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的方法。我也一直试图保持我的控制器超级瘦。因此,事实上,我可能会有另一个PORO,位于控制器,MyInflector,和史蒂夫的MyInflection之间。对你的情况来说,这一切可能是太多的开销,但我发现你的问题很有趣,所以我想我会解决这个问题。
https://stackoverflow.com/questions/36133336
复制相似问题