2011-05-15 9 views
12

作成時に自分の投稿にサインインしている現在のユーザーをどのように関連付けるのですか?現在のユーザーと投稿を関連付ける方法を教えてください。

マイポストモデル:

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

しかしそれdosent仕事私はモデル内のメソッドCURRENT_USERを使用することはできませんので。ここで

は私のコントローラです:

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 

私は関連を構築する方法を教えてください。だから、ポストのuser_id coloumnがcurrent_user.id

答えて

29

は、あなたの作成アクションで

@post.user = current_user 

を追加割り当てされることを。

はそれともUserモデルにhas_many :posts関連性を持っている場合の対処:

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

if @post.save 
    ... 
+1

ユーザがcurrent_userを変更して、ウェブサイト – Max

+3

を「hack」することは可能でしょうか?コントローラーで安全なときに、フォームのhidde_fieldを使用してください。 –

21

は、私はあなたのユーザーを通して、あなたのポストを作成することをお勧め:

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

これは自動的にあなたのためのuser_idで埋めます。

+0

いずれにしても良いですか? – LearningRoR

+3

いずれにしても良い。しかし、 'show'、' edit'、 'update'、' destory'メソッドには1つのポイントがあります。現在の方法では、ユーザーAはユーザーBの投稿を表示、更新、または削除できます。ですから、一般的には、スコープ付きのメソッドを使ってポストを取得する方が良いでしょう。つまり、 'show'の' @post = current_user.posts.find(params [:id]) 'です。もちろん、他のユーザーがお互いの投稿を更新したい場合は、あなたのやり方は大丈夫です。 – PeterWong

+0

ああ、説明のおかげで。アプリケーションでこのメソッドを使用します。 – LearningRoR