簡體   English   中英

僅在視圖中覆蓋活動記錄模型屬性

[英]Overriding active record model attributes only in the view

我有一個稱為人的對象,該對象有一個稱為作業的字段。 我希望用戶能夠添加自己的作業(顯然將以他們自己的語言添加),但是我希望有人在執行Human.job時可以翻譯數據庫中默認的任何作業,從而可以進行翻譯默認值是在視圖中,而不是在模型中,因為我有一些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'

例如:

從事“編碼員”工作的人類“鮑勃”應該是會計的“奴隸”,而使用法語使用該應用程序的人應該是“編碼員”,但是我仍然應該能夠為每個編碼員做一個發現。

如果您想以不同的方式顯示工作名稱,那么最好的方法是在助手中。 這樣可以使表示邏輯脫離您的模型。 您的幫助程序代碼將等效於is_view? 碼。

誠然,這意味着您每次顯示作業名稱時都必須調用它,這可能是您要避免的名稱。 您可以創建一個委托類,在您的視圖中將其用於人類。 盡管將人類傳遞給視圖時,您仍需要記住創建人類的委托版本。

例如:

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

然后,您可以在控制器中執行以下操作:

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

SimpleDelegator是一個標准的ruby類,如果delegator類未定義方法,則該方法僅將任何方法調用都委派給“ wrapped”對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM