2012-01-21 16 views
5

ho qualcosa di simile:come specificare i campi da impostare per accepts_nested_attributes_for in ActiveRecord

class Profile < ActiveRecord::Base 
    belongs_to :user  
    delegate :full_name, :to => :user 

    accepts_nested_attributes_for :user 
    ....... 

Questo lavoro bene come voglio profilo da essere in grado di impostare first_name e last_name in utente. Ma questo rappresenta una minaccia per la sicurezza se l'utente inietta altri parametri nel modulo.

Come rendere accept_nested_attributes_for richiede solo first_name e last_name e rilascia altri parametri?

risposta

0

Ci sono due opzioni che posso pensare e sono in realtà allo stesso modo in cui gestireste l'assegnazione di massa senza passare per anaf.

  1. accept_nested_attributes_for rispetterà attrs_accessible sul modello utente. Se si specifica che un attributo non è esposto all'assegnazione di massa sul modello utente, non sarà possibile assegnarlo tramite accept_nested_attributes_for a nessuno dei due.

  2. È possibile gestire l'igienizzazione nel controller dei profili. Gli attributi che verranno passati al modello utente entreranno sotto params [: profile] [: user_attributes]. È quindi possibile utilizzare slice per ottenere solo gli attributi che si desidera consentire oppure utilizzare except per eliminare gli attributi che non si desidera consentire. Anche se preferisco la whitelist agli attributi consentiti rispetto alla lista nera.

Opzione 1 interesserebbe ovunque si utilizza l'assegnazione di massa per il modello di utente, mentre l'opzione 2 incida solo i parametri che entrano attraverso il controller profili

Problemi correlati