11 votes

Quel est l'équivalent en ruby de la fonction getattr de python ?

Je suis nouveau sur rails et j'essaye de faire un peu de refactoring (mettre un renderer partiel qui liste les titres dans app/views/shared ) Le renderer montre les dates avec les titres. Cependant, les différents utilisateurs du moteur de rendu utilisent des dates différentes. A mi-chemin de la refactorisation, j'ai

title_date = list_titles.created_on

Pour l'autre utilisateur du moteur de rendu, je voudrais

title_date = list_titles.updated_on

Puis-je utiliser une chaîne de caractères que je passe (en utilisant le paramètre :locals) ? Je sais qu'en Python je pourrais faire

date_wanted = 'created_on'
title_date = getattr(list_titles, date_wanted)

mais je n'arrive pas à trouver comment faire cela en ruby (évidemment, dans rails, je passerais la chaîne date_voulue par la vue appelant le moteur de rendu partiel).

14voto

Matt Haley Points 1954

La déclaration équivalente en Ruby :

date_wanted = :created_on
title_date = list_titles.send(date_wanted)

4voto

Je pense que la réponse à la question initiale est envoyer :

irb(main):009:0> t = Time.new
=> Thu Jul 02 11:03:04 -0500 2009
irb(main):010:0> t.send('year')
=> 2009

send vous permet d'appeler dynamiquement une méthode de nom arbitraire sur l'objet.

0voto

Jason Miesionczek Points 7033

Vous pourriez ajouter une fonction au modèle comme suit

def get_date(date)
  return created_on if date == 'created'
  return updated_on
end

0voto

Parslip Points 19

La réponse de Matt correspond exactement à votre question et il se peut que je ne comprenne pas bien votre situation, mais...

Je passerais l'objet utilisateur entier dans le partial via le hash local.

render( 
  :partial => "shared/titles", 
  :object => @titles, 
  :locals => { :user => @user } 
)

Puis, dans la méthode partielle, appeler une méthode d'aide pour renvoyer la date correcte pour chaque titre, quelque chose comme :

<p><%= title_date_for_user(title, user) %></p>

Transmettre l'utilisateur et chaque objet de titre à la méthode d'aide.

def title_date_for_user(title, user)
  case user.date_i_like_to_see
  when "created_on"
    title_date = title.created_on
  when "updated_on"
    title_date = title.updated_on
  end
  return title_date.to_s(:short)
end

T date_i_like_to_see se trouve dans le modèle Utilisateur et renvoie une chaîne de caractères ( created_on o updated_on ) sur la base d'une logique propre à l'utilisateur concerné.

Cette approche permet d'éliminer la plus grande partie de la logique et de conserver une vue claire et nette. De plus, elle facilite l'ajout ultérieur de fonctionnalités spécifiques à un utilisateur donné.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X