Rails: Come per il trattamento di alcuni campi di informazioni del modello in modo indipendente? Per esempio. Conto vs. informazioni profilo
-
22-09-2019 - |
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.
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.