2009-04-24 12 views
10

Sono nuovo alle rotaie e sto provando a fare un piccolo refactoring (mettendo un riproduttore parziale che elenca titoli in app/views/condivisi) Il renderer mostra le date insieme ai titoli. Tuttavia, diversi utenti del renderer usano date diverse. in parte attraverso il refactoring hoQual è l'equivalente rubino di getome di pitone

title_date = list_titles.created_on 

Per l'altro utente del renderer vorrei

title_date = list_titles.updated_on 

Così posso usare una stringa mi passano attraverso (utilizzando i parametri: gente del posto)? So in Python che potrei fare

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

ma non riesco a capire come farlo in rubino. (Ovviamente in rotaie vorrei passare la stringa date_wanted attraverso dalla vista chiamando il rendering parziale.)

risposta

11

La dichiarazione equivalente in Ruby:

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

Si potrebbe aggiungere una funzione al modello come questo

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

risposta di Matt è corretto per la domanda esatta e potrei essere il modo off-segno con capire la vostra situazione, ma ...

mi piacerebbe passare l'intero oggetto utente i nto il parziale tramite l'hash del luogo.

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

Poi all'interno della parziale chiamare un metodo di supporto per restituire la data corretta per ogni titolo, qualcosa di simile a:

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

Passare l'utente e ogni oggetto titolo per il metodo di supporto.

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 

Procedimento date_i_like_to_see risiede nel modello utente e restituisce una stringa (created_on o updated_on) basato su una logica particolare ad un dato utente.

Questo approccio riduce la maggior parte della logica e mantiene la vista piacevole e pulita. Inoltre semplifica l'aggiunta di ulteriori funzionalità specifiche per un determinato utente in un secondo momento.

3

Penso che la risposta alla domanda iniziale è inviare:

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

invio consente di chiamare in modo dinamico un metodo arbitrario nome sull'oggetto.

Problemi correlati