Rails: Come per il trattamento di alcuni campi di informazioni del modello in modo indipendente? Per esempio. Conto vs. informazioni profilo

StackOverflow https://stackoverflow.com/questions/2322032

Domanda

Ho un modello per l'utente con le informazioni di solito (di accesso, e-mail, nome, luogo, etc). Tuttavia, quando gli utenti decidono di modificare le loro informazioni, mi piacerebbe separare i campi da modificare secondo le preoccupazioni appropriate.

Per esempio, mi piacerebbe avere Name, Bio e Location per essere modificato in una pagina Profile o scheda, e login, email e password per essere modificato in una pagina Account o scheda.

Quali sono le migliori pratiche, e il modo più sicuro, per realizzare questo? Dovrei avere due modelli / risorse separate: Utente e ProfiloUtente? O posso semplicemente creare qualcosa come un metodo di profile nel UserController, con un modulo personalizzato con solo i campi del profilo specifici e link ad esso nella pagina utente? Sono molto confuso su come andare su questo.

Grazie in anticipo per tutte le idee si potrebbe avere.

È stato utile?

Soluzione

Credo che dipende il resto della vostra applicazione. Sembra che nel tuo caso è bene essere modulare. Se si desidera che gli utenti siano in grado di vedere il profilo di altri utenti, è un vantaggio avere un modello separato per il profilo e piace con un rapporto has_one. Avevo appena chiamo la Profile classe in modo che si può accedere attraverso user.profile nel vostro controller e punti di vista.

Modelli:

class User < ActiveRecord::Base
  has_one :profile, :dependent => :destroy
end

class Profile < ActiveRecord::Base
  belongs_to :user
end

Altri suggerimenti

Se tutti gli utenti hanno sia il profilo e campi rappresentano quindi non vorrei metterlo in modelli separati. E 'solo aggiungere complexiety unnecesary ai moduli e aggiungere possono aggiungere alcune query SQL.

Non vedo qui eventuali problemi di sicurezza. In caso di modifica, entrambe le azioni (Modifica account e profili) devono essere protetti allo stesso modo - in modo che solo utente proprietario dovrebbe essere in grado di modificare entrambi. Se lui vuole "hack" e modificare anche la sua login quando modifica il suo primo nome, allora è il suo problema. Esso non causerà alcun problema dal momento che gli è consentito di modificare entrambi i campi.

Secondo viste che sono visualizzabili per gli altri:. Semplicemente non visualizzare Non ci nessun campo che appartiene al conto della parte

Come separare esso? Per me il modo più pulito è quello di aggiungere questo tipo di percorsi:

map.resources :accounts
map.resources :profiles

e utilizzare i percorsi come /accounts/34/edit da modificare conto della parte e /profiles/34/edit di modificare parte del profilo.

In questo caso sarà necessario un controller separato per entrambi i percorsi: accounts_controller.rb e profiles_controller.rb. Se condividono un sacco di metodi e comportamenti simili, è possibile aggiungerlo in users_controller.rb e nei profili e account controller ereditano da esso.

È anche possibile farlo con un controller:

map.resources :accounts, :controller => 'users'
map.resources :profiles, :controller => 'users'

Ma io non so come passare un po 'di valore aggiunto con percorsi creati con resources. Quando si utilizza connect si può passare con :defaults => {:foo => 'bar'} e allora sarà availble nel controller come params[:foo] ma non sembra di lavorare con resources. Così come si può distinguere tra gli account e profili? Lo si può leggere da URL corrente ( qui è esempio ). E poi nel controllore è possibile rendere diversi punti di vista in base alla risorsa richiesta.

Sarei propenso a tagliare lungo il grano qui. Sta andando essere più facile per mappare un modello ad una forma. Quindi, se si dispone di informazioni a cui si accede all'interno di diverse forme in l'interfaccia utente, vorrei creare un modello per ciascuno di essi.

Detto questo, a un certo punto nei miei sistemi tendo a tirare le informazioni del profilo fuori dalla classe base per l'utente, in modo da l'utente diventa esclusivamente per l'autenticazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top