2009-04-24 11 views
10

Ich bin neu bei Schienen und versuchen, ein wenig Refactoring (setzen einen partiellen Renderer, Titel in app/views/shared) Der Renderer zeigt die Daten zusammen mit den Titeln. Verschiedene Benutzer des Renderers verwenden jedoch unterschiedliche Daten. Teil Weg durch Refactoring IWas ist das Ruby-Äquivalent von Python's getattr

title_date = list_titles.created_on 

Für die anderen Benutzer des Renderers habe ich möchte

title_date = list_titles.updated_on 

So kann ich einen String I durchlaufen (mit den: Einheimische Parameter)? Ich weiß in Python konnte ich

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

tun, aber ich kann nicht herausfinden, wie man das in Ruby. (Offensichtlich in Schienen würde ich die date_wanted Schnur durch aus der Sicht passieren den Teil Renderer aufrufen.)

Antwort

11

Die äquivalente Aussage in Ruby:

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

Sie eine Funktion zum Modell hinzufügen könnte wie dieses

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

Matts Antwort ist richtig für Ihre genaue Frage, und ich könnte weg Zeichen sein, mit Ihrer Situation zu verstehen, aber ...

ich die gesamte Benutzerobjekt passieren würde ich nto die teilweise über die Einheimischen Hash.

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

Dann innerhalb des Teils eine Hilfsmethode rufen Sie das richtige Datum für jeden Titel zurückzukehren, so etwas wie:

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

die Benutzer Geben und jeden Titel Objekt an die Hilfsmethode.

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 

date_i_like_to_see Die Methode beruht auf dem Benutzermodell und liefert eine Zeichenkette (created_on oder updated_on) basierend auf einiger Logik insbesondere auf den gegebenen Benutzer.

Dieser Ansatz versteckt den größten Teil der Logik und hält Ihre Ansicht sauber und schön. Außerdem können Sie später weitere Funktionen für einen bestimmten Benutzer hinzufügen.

3

Ich denke, die Antwort auf die ursprüngliche Frage senden:

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

senden Sie eine dynamisch aufrufen können willkürlich benannte Methode für das Objekt.

Verwandte Themen