aiutami a capire Rails e attributi come metodi di classe

0

Questo è dal tutorial Hartl Rails . Stiamo registrando automaticamente un utente nel processo di creazione di quell'utente con una richiamata su #create_remember_token . Funziona benissimo ma ci sono alcune cose, non sono chiaro. Per favore, sopportami perché sono completamente confuso al punto che non so nemmeno come porre la mia domanda.

Ho un modello utente:

class User<ActiveRecord::Base
...
...

before_create :create_remember_token
def User.new_remember_token
  SecureRandom.urlsafe_base64
end

def User.encrypt(token)
  Digest::SHA1.hexdigest(token.to_s)
end

private

  def create_remember_token
    self.remember_token = User.encrypt(User.new_remember_token)
  end

...

Sono confuso riguardo al ::new_remember_token e alla crittografia come metodi collegati a User . Sembra che siano attributi di User come name , email , password ecc., Perché sono accessibili con notazione a punti. Ma sono definiti come metodi e sembrano restituire un valore calcolato. Non capisco, perché un attributo del modello User è riferito a self per l'assegnazione di self.remember_token e User.encrypt per l'accesso al metodo di classe.

La mia domanda

Qual è la differenza tra quanto sopra e il seguente dove User , è sostituito con self . ?

class User<ActiveRecord::Base
...
...

before_create :create_remember_token
def new_remember_token
  SecureRandom.urlsafe_base64
end

def encrypt(token)
  Digest::SHA1.hexdigest(token.to_s)
end

private

  def create_remember_token
    self.remember_token = self.encrypt(self.new_remember_token)
  end

...

Sono un novizio nel linguaggio ruby , ma piuttosto buono con javascript, quindi se c'è un js analogico potrebbe aiutarmi a metterlo in questi termini.

    
posta tim 11.12.2013 - 17:57
fonte

2 risposte

1

Al momento stai lavorando al modello Utente all'interno di Ruby mentre osservi il codice che puoi vedere

def function

end

Questo crea una funzione che esiste all'interno della classe User, quindi in teoria dalla maggior parte degli altri nella tua applicazione potresti fare User.some_function, tu usi solo self.some_function dalla classe.

Non c'è alcuna differenza tra l'uso di User.encrypt e di self.encrypt eccetto che è più sicuro, self.function significa solo guardare all'interno della classe corrente.

Penso che probabilmente stai confondendo attributi e funzioni perché non vedi () alla fine delle chiamate di funzione, in realtà non li usi in Ruby a meno che non passi i parametri alla funzione.

Dove menzioni nome utente, password, email ecc. questi sono campi associati al database e sono attributi.

Il concetto da comprendere qui è che il modello User rappresenta l'associazione con il database sottostante, puoi (come hai) aggiungere funzionalità extra per garantire la qualità dei dati che entrano, ad esempio:

before_create :create_remember_token

Ciò significa che se QUALSIASI luogo all'interno dell'applicazione si crea un nuovo utente il modello chiama tale funzione come parte del processo di creazione del record. Essenzialmente, costruendo funzionalità nei modelli, puoi garantire che tutti i dati che entrano nel database vengano trattati allo stesso modo.

    
risposta data 11.12.2013 - 19:31
fonte
1

I don't understand why an attribute of the User model is referred to with self for assigning self.remember_token and User.encrypt for accessing the class method. What's the difference between the above and the following where User. is replaced with self.

Funzionalmente non vi è alcuna differenza tra User e self nel contesto della classe User , ma si differenziano l'una dall'altra nel contesto dell'istanza della classe User . Pertanto, per la classe di contesto User puoi chiamare i metodi ::new_remember_token come entrambi di User class e self , e restituiscono gli stessi risultati (per il contesto).

self.new_remember_token

User.new_remember_token

Tuttavia, come denoti correttamente, quell'attributo del modello User è riferito ad entrambi con self e con User . Quindi credo che l'autore abbia messo questa differenza per due ragioni principali:

  1. Poiché ::new_remember_token è dichiarato come proprietà della classe User stesso, vale a dire come metodo singleton, la chiamata alla shell deve essere eseguita con call alla classe User ifself, nel caso in cui self non è User class, o usare self operator, quando self === User .

  2. Per dividere i significati delle proprietà reali che sono specchiate su DB e i metodi di classe singleton che non hanno quella funzione. Quindi hai visto:

    self.remember_token = ... # call to property 'remember_token'
    
    User.new_remember_token # call to User model's singleton method
    

    Tuttavia, #new_remember_token potrebbe essere dichiarato come metodo di istanza User come segue:

    def new_remember_token
       ...
    end
    

    E chiamaci shell con:

    self.remember_token = self.encrypt(self.new_remember_token)
    

    Ma l'autore ha in mente che lo scopo del metodo ::new_remember_token non è lo stesso degli attributi.

risposta data 22.01.2014 - 11:52
fonte

Leggi altre domande sui tag