Переопределение атрибутов модели активной записи только в представлении - PullRequest
0 голосов
/ 04 октября 2010

У меня есть объект с именем человека, и у этого объекта есть поле с именем job.Я хочу, чтобы пользователи могли добавлять свои собственные задания (которые, очевидно, будут добавляться на их родном языке), но я хочу, чтобы любая работа, которая по умолчанию выполнялась в базе данных, переводилась, когда кто-то делает 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'

например:

Человек 'Боб' с заданием 'Кодер' должен быть 'рабом' для бухгалтеров и 'le кодер' для тех, кто использует приложение на французском языке, но я все еще смогу найти для каждого кодера поиск.

1 Ответ

0 голосов
/ 05 октября 2010

Если вы хотите представить название задания по-разному, тогда лучшее место для этого - помощник.Это держит логику представления вне вашей модели.Ваш вспомогательный код будет эквивалентен вашему 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

Тогда в контроллере вы можетеdo:

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, который просто делегирует любые вызовы метода «обернутому» объекту, если класс делегата не определяет метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...