Ruby on rails 仅在视图中重写活动记录模型属性
我有一个名为human的对象,该对象有一个名为job的字段。我希望用户能够添加他们自己的作业(显然将以他们自己的语言添加),但我希望数据库中的任何默认作业在有人执行Human.job时被翻译,如果默认值在视图中,rails可以转换它,但是如果它在模型中,rails就不能转换它,因为我有一些sql逻辑,可以测试有多少人从事编码工作Ruby on rails 仅在视图中重写活动记录模型属性,ruby-on-rails,activerecord,internationalization,model,Ruby On Rails,Activerecord,Internationalization,Model,我有一个名为human的对象,该对象有一个名为job的字段。我希望用户能够添加他们自己的作业(显然将以他们自己的语言添加),但我希望数据库中的任何默认作业在有人执行Human.job时被翻译,如果默认值在视图中,rails可以转换它,但是如果它在模型中,rails就不能转换它,因为我有一些sql逻辑,可以测试有多少人从事编码工作 #Human class Human < ActiveRecord::Base validates_presence_of :job, :name def
#Human
class Human < ActiveRecord::Base
validates_presence_of :job, :name
def job
if is_view?
key = job.gsub(/ /,'_')
translation = I18n.translate("jobs.#{key.downcase}")
if translation.include?('translation missing:')
job
else
translation
end
else
job
end
end
end
#en.yml
en:
jobs:
coder: 'coder'
#en-Accountants.yml
en-Accountants:
jobs:
coder: 'slave'
#fr.yml
fr:
jobs:
coder: 'le coder'
#人类
类Human
例如:
一个有“编码员”工作的人类“鲍勃”应该是会计的“奴隶”,对那些使用法语应用程序的人来说应该是“乐编码员”,但我应该仍然能够为每个编码员做一个查找。如果你想以不同的方式呈现工作名称,那么最好的地方就是在助手那里。这使得模型中不存在表示逻辑。您的助手代码将等同于您的
is\u视图?
code
不可否认,这意味着你每次显示工作名称时都必须调用它,这可能是你试图避免的。您可以创建一个delegator类,用于视图中的人员。但是,当您将人员传递给视图时,仍然需要记住创建人员的委派版本
比如说:
class HumanView < SimpleDelegator
def job
unchanged_job = super # The actual saved job string
key = unchanged.gsub(/ /,'_')
translation = I18n.translate("jobs.#{key.downcase}")
if translation.include?('translation missing:')
unchanged_job
else
translation
end
end
end
SimpleDelegator
是一个标准的ruby类,如果delegator类没有定义方法,它只会将任何方法调用委托给“wrapped”对象。谢谢!这是一个很大的帮助!
def index
humans = Human.find(:all) # For example
@humans = humans.map { |h| HumanView.new(h) }
end
def show
h = Human.find(params[:id])
@human = HumanView.new(h)
end