Ruby on rails 仅在视图中重写活动记录模型属性

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的对象,该对象有一个名为job的字段。我希望用户能够添加他们自己的作业(显然将以他们自己的语言添加),但我希望数据库中的任何默认作业在有人执行Human.job时被翻译,如果默认值在视图中,rails可以转换它,但是如果它在模型中,rails就不能转换它,因为我有一些sql逻辑,可以测试有多少人从事编码工作

#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