2011-05-15 8 views
12

Jak powiązać bieżącego użytkownika, który jest zalogowany do mojego postu podczas tworzenia?Wymyśl sposób powiązania bieżącego użytkownika z postem?

mój post model:

before_create :owner 
belongs_to :user 
def owner 
    self.user_id = current_user.id 
end 

Ale dosent pracy, ponieważ nie mogę użyć metody current_user w modelu.

Oto mój kontroler:

class PostsController < ApplicationController 
before_filter :authenticate_user! 

    # GET /posts 
    # GET /posts.xml 
    def index 
    @posts = Post.all 

    respond_to do |format| 
     format.html # index.html.erb 
     format.xml { render :xml => @posts } 
    end 
    end 

    # GET /posts/1 
    # GET /posts/1.xml 
    def show 
    @post = Post.find(params[:id]) 

    respond_to do |format| 
     format.html # show.html.erb 
     format.xml { render :xml => @post } 
    end 
    end 

    # GET /posts/new 
    # GET /posts/new.xml 
    def new 
    @post = Post.new 

    respond_to do |format| 
     format.html # new.html.erb 
     format.xml { render :xml => @post } 
    end 
    end 

    # GET /posts/1/edit 
    def edit 
    @post = Post.find(params[:id]) 
    end 

    # POST /posts 
    # POST /posts.xml 
    def create 
    @post = Post.new(params[:post]) 

    respond_to do |format| 
     if @post.save 
     format.html { redirect_to(@post, :notice => 'Post was successfully created.') } 
     format.xml { render :xml => @post, :status => :created, :location => @post } 
     else 
     format.html { render :action => "new" } 
     format.xml { render :xml => @post.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 

    # PUT /posts/1 
    # PUT /posts/1.xml 
    def update 
    @post = Post.find(params[:id]) 

    respond_to do |format| 
     if @post.update_attributes(params[:post]) 
     format.html { redirect_to(@post, :notice => 'Post was successfully updated.') } 
     format.xml { head :ok } 
     else 
     format.html { render :action => "edit" } 
     format.xml { render :xml => @post.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /posts/1 
    # DELETE /posts/1.xml 
    def destroy 
    @post = Post.find(params[:id]) 
    @post.destroy 

    respond_to do |format| 
     format.html { redirect_to(posts_url) } 
     format.xml { head :ok } 
    end 
    end 
end 

Jak budować skojarzenia? Tak, że po kolumnowej błyskawicznej user_id zostanie przypisany current_user.id

Odpowiedz

29

Dodaj

@post.user = current_user 

w tworzenie działania.

Lub jeśli masz has_many :posts stowarzyszenie na User modelu zrobić:

@post = current_user.posts.new(params[:post]) 

if @post.save 
    ... 
+1

Czy można zmienić użytkownika current_user i "zhakować" stronę internetową – Max

+3

, kiedy robisz to za pomocą hidde_field w formularzu wtedy możliwe, kiedy w kontrolerze - bezpiecznym –

21

Proponuję stworzenie swojego posta pośrednictwem użytkownik:

# in create 
@post = current_user.posts.build(params[:post]) 

To automatycznie wypełnić user_id dla Ciebie.

+0

Czy jest tak czy inaczej dobra? – LearningRoR

+3

Tak czy inaczej dobrze. Ale jest jeden punkt dla twoich metod 'show',' edit', 'update' i' destory'. Na obecnym etapie użytkownik A może przeglądać, aktualizować lub usuwać posty użytkownika B. Więc ogólnie byłoby lepiej użyć metod o ustalonym zakresie, aby pobrać post, tj. '@post = current_user.posts.find (params [: id])' w 'show'. Oczywiście, jeśli naprawdę chcesz, aby inni użytkownicy aktualizowali swoje posty, twój sposób jest w porządku. – PeterWong

+0

Dobra, dziękuję za wyjaśnienie. Użyję tej metody w mojej aplikacji. – LearningRoR

Powiązane problemy