2009-08-20 13 views
6

Así que, básicamente, tengo un controlador. algo como estoAcceder a las propiedades del modelo en Rails

def show 
@user = User.find[:params[id]] 
#code to show in a view 
end 

usuario tiene propiedades tales como nombre, dirección, sexo, etc ¿Cómo puedo acceder a estas propiedades en el modelo? ¿Puedo sobrecargar el acceso del modelo por nombre, por ejemplo, y reemplazarlo con mi propio valor o concatenar algo en él? Al igual que en la vista show.html.erb para este método, es posible que desee concatenar el nombre del usuario con 'Mr.' o 'Señora' dependiendo del sexo? ¿Como es posible?

Respuesta

9

dudaría para anular los atributos, y en lugar de añadir a la modelo como este:

def titled_name 
    "#{title} #{name}" 
end 

Sin embargo, se puede acceder a los campos directamente como esto:

def name 
    "#{title} #{self[:name]}" 
end 
+0

¿No sería el segundo bloque de código caer en una llamada recursiva y bloquearse? –

0

Puede sobrecargar fácilmente los atributos tal como sugiere.

es decir, si el nombre es un campo en la tabla de base de datos de usuarios, puede hacerlo:

def name 
    "#{title} #{read_attribute[:name]}" 
end 

La función read_attribute devolverá el valor de la columna de base de datos para el campo.

Advertencia: No estoy seguro de que esta sea una buena idea. Si desea un método que muestre los datos del modelo de una manera modificada, me sentiría tentado de no sobrecargar los métodos predeterminados, y llamarlos de otra manera, esto evitará un cierto nivel de ofuscación.

Documentación aquí: http://api.rubyonrails.org/classes/ActiveRecord/Base.html (bajo 'Sobrescribiendo descriptores de acceso por defecto')

+2

Puede que desee tener cuidado de hacer eso, ya que podría confundir a la interfaz. Podría ser extraño hacer name = "Joe" y regresar "Mr. Joe". –

+1

Sin mencionar, este código solo funciona si su base de usuarios no contiene solteras. ;) –

+0

@Sarah, ah, tiene toda la razón, voy a hacer una solución para ello. @Jamie - sí, estoy de acuerdo, de ahí la advertencia que está en mi respuesta. – DanSingerman

0

Si tiene acceso a los datos almacenados directamente en la base de datos se puede hacer esto en ti Vista:

<%= @user.firstname %> 
<%= @user.gender %> 

etc.

Si necesita construir representaciones personalizadas de los datos, entonces deberá crear ayudantes o extender el modelo (como se indicó anteriormente).

+0

Necesito estos en el modelo. Sé cómo ponerlos en la vista. –

0

que tienden a utilizar métodos auxiliares añadidos al modelo para ese tipo de cosas:

def formatted_name 
    "#{title} #{first_name} #{last_name}" 
end 

(Editar post anterior volvió a mirar a mi código y ayudantes realizadas se supone que es para la presentación relacionadas-(marca-. a) cosas solamente.)

(Editar de nuevo para eliminar sobrante parámetro ... Caray, no hay suficiente café esta mañana.)

(Editar de nuevo para reemplazar con $ # ... Tal vez yo sólo debe eliminar este uno ¿eh?)

+0

Esos dólares deberían ser hashes. –

5

Usted puede crear atributos virtuales dentro de su modelo para representar estas estructuras.

Hay una railscast sobre este mismo tema pero en resumen se puede hacer algo como esto en su modelo de

def full_name 
    [first_name, last_name].join(' ') 
end 

def full_name=(name) 
    split = name.split(' ', 2) 
    self.first_name = split.first 
    self.last_name = split.last 
end 

Si desea cambiar explícitamente el valor de un atributo al leer o escribir a continuación, puede utilizar los métodos read_attribute o write_attribute. (Aunque creo que estos pueden estar en desuso).

Funcionan reemplazando el método de acceso del atributo con el suyo. Como ejemplo, un campo de identificador de rama puede ingresarse como xxxxxx o xx-xx-xx. De modo que puede cambiar su método branch_identifier = para eliminar los guiones cuando los datos se almacenan en la base de datos. Esto se puede lograr al igual que

def branch_identifier=(value) 
    write_attribute(:branch_identifier, value.gsub(/-/, '')) unless value.blank? 
end 
Cuestiones relacionadas