2012-03-29 12 views
5

Quindi ho utilizzato la logica nel railscast "autenticazione da zero" allo http://railscasts.com/episodes/250-authentication-from-scratch e sembra funzionare e posso incollare un messaggio "Hai effettuato l'accesso come ..." all'indirizzo la parte superiore della pagina.Riferimento dell'utente corrente in Ruby on Rails

Ma se voglio fare qualcosa come log che ha inviato un post ho colpito un po 'un muro.

Non voglio inviarlo tramite un campo nascosto nel nuovo modulo di post, perché credo che ci siano problemi di sicurezza con questo.

Non voglio utilizzare la logica "appartiene a" nel tutorial rotaie a http://ruby.railstutorial.org/ruby-on-rails-tutorial-book perché anche se tecnicamente funzionerebbe qui, potrei in futuro bisogno di registrare chi ha creato una voce in cui la relazione "appartiene a" non esiste

Quello che ho cercato di fare è stato creare una chiamata di funzione "prima del salvataggio" nel mio modello di post che assegna un valore "created_by", ma suppongo che i modelli non possano accedere all'utente corrente creato come per il railscast di autenticazione.

Quindi ora non ho idea di come fare qualcosa di simile.

MODIFICA: Nuovo a Ruby, nuovo a ERD, tutto questo, ma ciò che intendo per la relazione di appartenenza non esiste è se esistesse, ad esempio, un sistema di classificazione per i post, ogni classificazione appartenesse a un post . Ma vorrei anche registrare chi ha inviato ciascuna valutazione.

+0

Puoi approfondire questa affermazione?"Potrei in futuro dover registrare chi ha creato una voce in cui la relazione" appartiene a "non esiste." – James

+0

http://stackoverflow.com/questions/1568218/access-to-current-user-from-within-a-model-in-ruby-on-rails http://stackoverflow.com/questions/2513383/access- current-user-in-model –

risposta

7

Se ho capito bene il problema che hai è il fatto che non è possibile vedere quale utente è attualmente Loggen utilizzando il metodo current_user aiutante nel modello, si può semplicemente impostare l'attributo created_by del post nel controller Post prima di salvare esso, qualcosa come:

def create 
    @post = Post.new(params[:post]) 
    @post.created_by = current_user.id 
    if @post.save 
    redirect_to whereyouwant_url, :notice => "Post successfully created" 
    else 
    render "new" 
    end 
end 
+0

Grazie, ho il sospetto che qualcosa del genere dovrebbe essere possibile, forse anche visto un esempio prima, ma Rails è un po ' travolgente finora. Abbastanza sicuro questo è esattamente ciò di cui ho bisogno. – user1299656

+0

durante l'aggiornamento, dobbiamo passare lo stesso? bcoz sto ottenendo il created_by rimosso durante l'aggiornamento .. :( –

0

Ok, non so cosa complicazioni esiste, ma qui va:

così addind un belongs_to rende il palo ha un campo chiamato user_id che è una chiave esterna per l'ID dell'utente. se tu aggiungessi un creato da, questo farebbe la stessa cosa, tranne che dovrai programmare da solo l'aggiornamento e il derefrenaggio. Penso che questo sia probabilmente il modo migliore per ottenere questa funzionalità, e dovresti solo aggiungerlo in seguito alle parti che non ce l'hanno, ma i binari lo rendono facile.

class User < ActiveRecord::Base 
    has_many :posts 
end 

class Post < ActiveRecord::Base 
    belongs_to :user, :as => :created_by 
end 



post.created_by 
user.posts 

darebbe accesso a tale utente, ed è questo equivale a utilizzare che cosa avete parlato, tranne rotaie avrebbe fatto la sua magia e aggiungere metodi per voi.

EDIT: se questo non funziona, scusa la tua domanda non è chiara sul perché hai bisogno di certe cose, ma puoi sempre aggiungere appartiene alla relazione abbastanza facile, questo è quello che consiglierei.

+0

Tecnicamente questo funzionerebbe, e non ho avuto alcun problema con esso. La mia preoccupazione è che se avrò bisogno di più di una chiave straniera in altre aree questo sarà un problema. Ad esempio, se avessi dei voti da post, avrei bisogno che ogni rating appartenga a un post, ma vorrei anche un registro di chi ha inviato ciascuno. È possibile avere più di una relazione "appartiene a" e riempire entrambe le chiavi esterne in questo modo? – user1299656

+0

da quello che ho capito, sì che avrebbe funzionato. Ho modelli con 4 appartiene a e 2 ha_manys, tu aggiungi solo più colonne, post_id, submitter_id, rating_id, ecc. – loosecannon

0

(alternativa al Giambelluca risposta Aldo 'xoen')

credo che si dovrebbe utilizzare un rapporto belongs_to come spiegato da Loosecannon, ma se davvero non si vuole, Inserisci il seguente metodo nella classe User:

def new_post(params) 
    post = Post.new(params) 
    post.created_by = id 
    post 
end 

e nel controllore:

def create 
    @post = current_user.new_post(params[:post]) 
    if @post.save 
    redirect_to @post, notice: 'Post successfully created' 
    else 
    render 'new' 
    end 
end