2012-03-29 9 views
5

Użyłem więc logiki w railscastu "authentication from scratch" pod numerem http://railscasts.com/episodes/250-authentication-from-scratch i wygląda na to, że działa i mogę umieścić wiadomość "Jesteś zalogowany jako ..." pod adresem u góry strony.Odwołanie do bieżącego użytkownika w Ruby on Rails

Ale jeśli chcę zrobić coś takiego jak dziennik, który wysłał post, uderzyłem trochę o ścianę.

Nie chcę przesłać go przez ukryte pole w nowym formularzu, ponieważ sądzę, że są z tym problemy z zabezpieczeniami.

Nie chcę używać logiki "należy do" w tutorialu szyn pod numerem http://ruby.railstutorial.org/ruby-on-rails-tutorial-book, ponieważ chociaż technicznie działałoby tutaj, mógłbym w przyszłości zarejestrować użytkownika, który utworzył wpis, w którym relacja "należy do" nie istnieje.

Próbowałem utworzyć wywołanie funkcji "before save" w moim modelu postu, który przypisuje wartość "created_by", ale domyślam się, że modele nie mogą uzyskać dostępu do current_user, który został utworzony zgodnie z railscastem uwierzytelniania.

Więc teraz nie mam pojęcia, jak zrobić coś takiego.

EDYCJA: Nowość w Ruby, nowa w ERD, wszystko to, ale to, co mam na myśli, mówiąc o przynależności do związku, nie istnieje, jeśli istniał, powiedzmy, system ocen dla stanowisk, każdy rating należałby do postu . Ale chciałbym również zalogować, kto przesłał każdą ocenę.

+0

można rozszerzyć na tym stwierdzeniem?"Być może będę musiał w przyszłości zarejestrować użytkownika, który utworzył wpis, w którym nie ma relacji" należy "." – James

+0

http://stackoverflow.com/questions/1568218/access-to-current-user-from-within-a-model-in-ruby-on-ones http://stackoverflow.com/questions/2513383/access- bieżący użytkownik-w-modelu –

Odpowiedz

7

Jeśli dobrze rozumiem problem masz jest fakt, że nie można zobaczyć, który użytkownik jest aktualnie loggen stosując metodę current_user pomocnika w modelu, można po prostu ustawić atrybut słupka created_by w kontrolerze Post przed zapisać to coś jak:

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

Dzięki, podejrzewałem, że coś takiego powinno być możliwe, może nawet widziałem przykład tego wcześniej, ale Rails jest trochę przytłaczające do tej pory. Jestem pewien, że dokładnie tego potrzebuję. – user1299656

+0

podczas aktualizacji, musimy przekazać to samo? bcoz otrzymuję created_by usunięte podczas aktualizacji .. :( –

0

Ok, nie jestem pewien co powikłania istnieje, ale tu idzie:

tak addind belongs_to sprawia, że ​​słupek ma pole o nazwie user_id która jest klucz obcy dla identyfikatora użytkownika. jeśli dodałeś utworzony przez, to zrobiłoby to samo, z wyjątkiem, gdybyś sam musiał zaprogramować aktualizację i derefreneces. Myślę, że jest to prawdopodobnie najlepszy sposób na uzyskanie tej funkcjonalności, a będziesz musiał dodać ją później do części, które jej nie mają, ale szyny ułatwiają to.

class User < ActiveRecord::Base 
    has_many :posts 
end 

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



post.created_by 
user.posts 

da Ci dostęp do tego użytkownika, a to jest to równoznaczne z użyciem czym rozmawialiście, z wyjątkiem szyn zrobi jej magii i dodać metody dla Ciebie.

EDYCJA: jeśli to nie działa, przepraszam, twoje pytanie nie było jasne, dlaczego potrzebowałeś pewnych rzeczy, ale zawsze możesz dodać, że związek jest relatywnie łatwy, to właśnie polecam.

+0

Technicznie to by zadziałało, i nie miałem żadnych problemów z tym. Obawiam się, że jeśli potrzebuję więcej niż jednego klucza obcego w innych obszarach, będzie to problemem. Gdybym na przykład miał oceny postów, potrzebowałbym, aby każda ocena należała do posta, ale chciałbym też, aby każdy z nich był zarejestrowany. Czy możliwe jest posiadanie więcej niż jednej relacji "należy do" i wypełnienie w ten sposób obu kluczy obcych? – user1299656

+0

z tego co rozumiem, tak, to by działało. Mam modele z 4 należą do i 2 has_many, po prostu dodaj więcej kolumn, post_id, submitter_id, rating_id, itp. – loosecannon

0

(alternatywa Giambelluca odpowiedź Aldo 'xoen')

myślę, że należy użyć relacji belongs_to jak wyjaśnił loosecannon, ale jeśli naprawdę nie chce, Dodaj następujące metody w klasie User:

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

w kontrolerze:

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