Ho guardato RailsCast, un altro video di attributi annidati, molti post SO e ho combattuto con questo per un po ', ma non riesco ancora a farlo capirlo. Spero sia qualcosa di piccolo.Impossibile assegnare in massa attributi protetti per la creazione di un modello nidificato has_many con Devise
ho due modelli, User
(creato da Devise), e Locker
(aka, un prodotto lista dei desideri), e sto cercando di creare un Locker
per un User
quando si iscrivono. Il mio modulo di login ha un campo per il nome del loro nuovo Locker
(giustamente chiamato :name
) che sto cercando di assegnare all'armadietto che viene creato dopo la registrazione di un nuovo utente. Tutto quello che sto sempre accolti con IS:
WARNING: Can't mass-assign protected attributes: locker
Ho provato ogni combinazione di accepts_nested_attributes
e attr_accesible
in entrambi i miei modelli, ma ancora non funziona nulla. Posso vedere dai log che è elaborato dal Devise # creare metodo, e so Devise non è abbastanza intelligente per creare i miei modelli come voglio :)
Ecco i bit rilevanti delle mie due modelli:
# user.rb
class User < ActiveRecord::Base
attr_accessible :username, :email, :password, :password_confirmation, :remember_me, :locker_attributes
# Associations
has_many :lockers
has_many :lockups, :through => :lockers
# Model nesting access
accepts_nested_attributes_for :lockers
end
e
# locker.rb
class Locker < ActiveRecord::Base
belongs_to :user
has_many :lockups
has_many :products, :through => :lockups
attr_accessible :name, :description
end
# lockers_controller.rb (create)
@locker = current_user.lockers.build(params[:locker])
@locker.save
sto assumendo che ho bisogno di sostituire il metodo di Devise create
per ottenere in qualche modo a questo lavoro, ma io sono abbastanza nuovo alle rotaie e sto abituando alla scatola nera "magica" natura di tutto questo.
Se qualcuno può darmi una mano, sarei incredibilmente grato. Ho già trascorso troppo tempo su questo come è :)
EDIT: Ho realizzato che ho omesso qualcosa nel mio problema. Il mio modello Locker
ha tre attributi - name
, description
(non obbligatorio) e user_id
per collegarlo allo User
. Il mio modulo di registrazione richiede solo il name
, quindi non sto eseguendo il ciclo di tutti gli attributi nel mio modulo annidato. Potrebbe avere qualcosa a che fare anche con il mio problema?
EDIT 2: Ho anche capito come sovrascrivere il metodo RegistrationsController#create
di Devise, ma non so cosa mettere lì. L'intera cosa di Devise resource
non ha senso per me, e sfogliare il loro codice sorgente per lo RegistrationsController
non mi ha aiutato molto.
E per i punti bonus: Quando un utente invia il form di login con i dati non validi, il campo Locker
torna sempre vuota, mentre i campi regolari concepire, nome utente & e-mail, vengono riempiti Questo potrebbe anche essere risolto facilmente. ? Se é cosi, come?
come stai creando l'armadietto? Puoi pubblicare il codice del controller? – mihai
Ho postato il mio Lockers # metodo di creazione, ma non penso che il mio codice stia arrivando anche a quello. Credo che Devise stia cercando di creare l'utente e di ignorare il mio codice del controller. Potrei sbagliarmi però. –
che dovrebbe essere facile da controllare, basta aggiungere una riga 'debugger' nel controller e vedere se si ferma lì. – mihai