2009-04-24 19 views
10

Soy nuevo en rails y trato de hacer un poco de refactorización (poner un renderizador parcial que enumera los títulos en la aplicación/views/shared) El procesador muestra las fechas junto con los títulos. Sin embargo, diferentes usuarios del procesador utilizan fechas diferentes. Forma parte a través de refactorización tengo¿Cuál es el equivalente en rubí del getattr de python?

title_date = list_titles.created_on 

Por el otro usuario del procesador me gustaría

title_date = list_titles.updated_on 

Así que puedo utilizar una cadena que pase por (utilizando los parámetros: clientes locales)? Sé que en Python podría hacer

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

pero no sé cómo hacerlo en ruby. (Obviamente, en los carriles Me pase la cadena date_wanted a través de la vista llamando al procesador parcial.)

Respuesta

11

La declaración equivalente en Ruby:

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

Se podría añadir una función al modelo como este

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

respuesta de Matt es correcta para su pregunta exacta y yo podría ser la forma fuera de la marca con la comprensión de su situación, pero ...

me lo pase todo el objeto usuario i nto el parcial a través del hash de los lugareños.

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

Luego, dentro de lo parcial llamar a un método de ayuda para devolver la fecha correcta para cada título, algo así como:

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

Pase el usuario y cada objeto de título para el método de ayuda.

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 

El método date_i_like_to_see reside en el modelo de usuario y devuelve una cadena (created_on o updated_on) basado en una lógica especial para el usuario dado.

Este enfoque esconde la mayor parte de la lógica y mantiene su vista agradable y limpia. Además, facilita agregar más funciones específicas para un usuario determinado más adelante.

3

Creo que la respuesta a la pregunta original es enviar:

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

envío le permite llamar dinámicamente un método llamado arbitrariamente sobre el objeto.

Cuestiones relacionadas