2009-04-24 23 views
10

Jestem nowy na szynach i staram się trochę refaktoryzować (umieszczanie częściowego renderera zawierającego tytuły w app/views/shared) Renderowanie pokazuje daty wraz z tytułami. Jednak różni użytkownicy renderera używają różnych dat. Część drogi przez refaktoringu mamCo to jest rubinowy odpowiednik python'a getattr

title_date = list_titles.created_on 

Dla pozostałych użytkownikowi renderujący chciałbym

title_date = list_titles.updated_on 

Więc mogę użyć ciągu I przechodzą przez (przy użyciu: miejscowych parametrów)? Wiem, że w Pythonie mogłem wykonać

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

, ale nie mogę się tego dowiedzieć w ruby. (Oczywiście w szynach chciałbym przekazać date_wanted ciąg poprzez z widoku wywołującego częściowego renderujący.)

Odpowiedz

11

odpowiednikiem rachunku w Ruby:

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

Można dodać funkcję do modelu jak ten

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

odpowiedź Matta jest właściwy dla danej dokładnym pytania i mogę być daleko znak ze zrozumieniem swoją sytuację, ale ...

Chciałbym przekazać cały obiekt użytkownika nto częściowe za pomocą skrótu locals.

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

Następnie w ciągu częściowe wywołać metodę pomocniczą, aby przywrócić prawidłową datę dla każdego tytułu, coś takiego:

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

Hasło użytkownika, a każdy tytuł obiektu do metody pomocnika.

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 

Sposób date_i_like_to_see rezyduje w modelu użytkownika i zwraca ciąg znaków (created_on lub updated_on) w oparciu o pewnej logiki szczególności do danego użytkownika.

Takie podejście eliminuje większość elementów logicznych i zapewnia ładny i czysty widok. Dodatkowo ułatwia później dodawanie kolejnych funkcji specyficznych dla danego użytkownika.

3

Myślę, że odpowiedź na oryginalne pytanie, to wysłać:

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

wyślij pozwala dynamicznie nazwać dowolnie nazwie metody na obiekcie.

Powiązane problemy