[ruby-it] metodi nel modello

Pietro Giorgianni giorgian a gmail.com
Lun 9 Feb 2009 09:37:18 CET


2009/2/9 Alessandro Ale <aleee.it a gmail.com>:
> Ciao,
> ho questa domanda: ho la classico modello user a cui è associato un
> modello "profilo".
>
> user ha un campo obbligatorio che si chiama 'login', e il profilo in
> generale non è obbligatorio, e comunque ha un campo che si chiama nome e
> un altro cognome
>
> ora vorrei che nelle viste quando si visualizza un utente venga
> visualizzato il nome e cognome se sono presenti (e quindi se c'e' il
> profilo), in alternativa vorrei che visualizzasse il login.
>
> Per far questo ho pensato di mettere un metodo del tipo
> 'nome_da_visualizzare' nel modello user, ma non so come fare
> (probabilmente vi sembrerà una domanda molto banale, ma non ci riesco lo
> stesso...)
>

manca un dato: se profile è presente, nome e cognome sono sicuramente
presenti oppure no?

se sì,

class User < ActiveRecord::Base
  has_one :profile

  def name_to_show
    profile ? "#{profile.first_name} #{profile.last_name}" : login
  end
end

altrimenti:

class User < ActiveRecord::Base
  has_one :profile

  def name_to_show
    (profile && profile.first_name && profile.last_name) ?
"#{profile.first_name} #{profile.last_name}" : login
  end
end

solo che così è illegibile, quindi meglio:

  def name_to_show
    if profile && profile.first_name && profile.last_name
      "#{profile.first_name} #{profile.last_name}"
    else
      login
    end
  end

ah, questa cosa di fare "#{a} #{b}" invece di a + " " + b oppure [a,
b].join ' ' è un vizio mio, l'ho preso anni fa, dopo la prima volta
che ho provato a concatenare 10000000 stringhe in un ciclo for, con
risultati devastanti. in effetti è molto leggibile finché sono #{a} e
#{b}, un po' meno quando si complica un po'.

meglio sarebbe, forse, definire in Profile:

class Profile < ActiveRecord::Base
  def full_name
    (first_name && last_name) ? "#{first_name} #{last_name}" : nil
  end
end

e poi in user:

def name_to_show
    (profile && profile.full_name) || login
end

così credo sia più chiaro, e in più la roba di profile la maneggia
profile, e la roba di user la maneggia user.

pietro


More information about the Ml mailing list