2010-10-04 2 views
0

J'ai un objet appelé humain et cet objet a un champ appelé travail. Je veux que les utilisateurs puissent ajouter leurs propres travaux (qui seront évidemment ajoutés dans leur propre langue) mais je veux avoir n'importe quel travail qui est un défaut dans la base de données pour être traduit quand quelqu'un fait un Human.job, peut traduire rails la valeur par défaut si elle est dans la vue mais pas si elle est dans le modèle car j'ai une logique sql qui teste combien d'humains ont le travail de codeur.Remplacement des attributs du modèle d'enregistrement actif uniquement dans la vue

#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' 

par exemple:

Un humain « Bob » avec un emploi de « Coder » devrait être « esclave » aux comptables et « le codeur » à ceux qui utilisent l'application en français, mais je devrais être en mesure de faites toujours une recherche pour chaque codeur.

Répondre

0

Si vous voulez présenter le nom du travail de différentes façons, le meilleur endroit pour le faire serait dans un assistant. Cela maintient la logique de présentation hors de votre modèle. Votre code d'assistance serait équivalent à votre code is_view?.

Certes, cela signifie que vous devez l'appeler chaque fois que vous affichez le nom du travail, probablement ce que vous essayez d'éviter. Vous pouvez créer une classe de délégant que vous utilisez pour les humains dans vos vues. Vous devez toujours vous rappeler de créer des versions déléguées d'humains, même si vous les transmettez à vos vues.

Quelque chose comme ceci par exemple:

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 

Ensuite, dans votre contrôleur, vous pouvez faire:

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 est une classe rubis standard seulement aux délégués toute méthode appelle à la « enveloppé » objet si la classe délégator ne définit pas la méthode.

+0

Merci Shadwell! C'est une grande aide! – davidahines

Questions connexes