2012-03-14 12 views
15

Per la mia app, ho diversi punti di accesso per la registrazione che convalidano le cose in modo diverso.Rails come impostare una variabile temporanea che non è un campo di database

Quindi, nella registrazione principale, non è richiesto nulla tranne il campo email e password. In un campo di iscrizione alternativo, sono necessari molti altri. Quindi nel modello utente ho

validate_presence_of :blah, :lah, :foo, :bah, :if => :flag_detected 

def flag_detected 
    !self.flag.nil? 
end 

Voglio impostare quella bandiera attraverso il controller. Tuttavia quel flag non è un campo di database. Mi chiedo solo se è possibile farlo in Rails o c'è qualcosa di sbagliato nel modo in cui sto pensando a questo? In tal caso, qual è il modo migliore per raggiungere questo obiettivo? Grazie.

+0

"variabili di istanza" (esposte tramite accessor, ad esempio 'attr', se necessario). Spetta al dibattito se è una "buona pratica" farlo in un modello, proprio perché non sono * parte * del modello * persistito *. Tuttavia, in un controller, perché no? –

+0

Ho solo bisogno di essere una variabile temporanea per quel salvataggio chiamato dal controller. Quando ho impostato @ user.flag = true nel controller, in realtà non lo vedo nel modello. – gtr32x

+0

Quindi devo definire un attr_accessor ad esso? Cosa succede se ho già attr_protected, c'è comunque intorno a questo? – gtr32x

risposta

28

Quello che vi serve è attr_accessor

class User < ActiveRecord::Base 
    attr_accessor :flag 
    attr_accessible :flag # if you have used attr_accessible or attr_protected else where and you are going to set this field during mass-assignment. If you are going to do user.flag = true in your controller's action, then no need this line 
end 

fondamentalmente attr_accessor :flag creare il user.flag e user.flag = ... metodi per il modello.

e attr_accessible è per protezione di assegnazione di massa.

+0

Fresco, attr_accessor ha funzionato! Grazie! – gtr32x

+0

Doh! non per Rails 4 http://easyactiverecord.com/blog/2014/04/01/rails4-strong-parameters-and-the-attr-accessible-macro/ – olyv

+0

Trovo più facile usare solo una variabile di classe @flag per questo argomento .. – JChow

1

Sembra che tu abbia bisogno di definire metodo setter

class User < ActiveRecord::Base 
    attr_accessible :flag 

    def flag=(boolean) 
    boolean 
    end 
end 
+0

Ho appena provato questo, insieme a attr_accessible, ma non funziona ancora. – gtr32x

3

In seguito al dibattito migliori pratiche:

Creare un metodo che fa quello che si vuole. Cioè save_with_additional_validation. Questo è un codice molto più chiaro e autodocumentante e funziona allo stesso modo. Basta chiamare questo metodo invece di save()

Problemi correlati