2011-05-15 23 views
12

Làm cách nào để liên kết người dùng hiện tại của tôi được đăng nhập vào bài đăng của tôi khi tạo?Tìm hiểu cách liên kết người dùng hiện tại để đăng bài?

bài mô hình của tôi:

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

Nhưng mà công việc dosent vì tôi không thể sử dụng phương pháp CURRENT_USER trong mô hình.

Đây là bộ điều khiển của tôi:

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 

Làm thế nào để xây dựng hiệp hội? Vì vậy, rằng coloumn bài user_id được giao current_user.id

Trả lời

29

Thêm

@post.user = current_user 

trong tạo hành động của bạn.

Hoặc nếu bạn có has_many :posts hiệp hội trên User mô hình làm:

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

if @post.save 
    ... 
+1

Có khả năng cho người dùng thay đổi current_user và "hack" trang web – Max

+3

khi bạn làm điều đó thông qua hidde_field trong biểu mẫu sau đó có thể, khi ở trong bộ điều khiển - an toàn –

21

tôi sẽ khuyên bạn nên tạo bài của bạn thông qua người dùng của bạn:

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

này sẽ tự động điền vào user_id cho bạn.

+0

Là một trong hai cách tốt? – LearningRoR

+3

Dù bằng cách nào tốt. Nhưng có một điểm cho phương thức 'show',' edit', 'update' và' destory' của bạn. Theo cách hiện tại của bạn, người dùng A có thể xem, cập nhật hoặc xóa bài đăng của người dùng B. Vì vậy, nói chung nó sẽ là tốt hơn để sử dụng phương pháp scoped để lấy bài, tức là '@post = current_user.posts.find (params [: id])' trong 'show'. Tất nhiên nếu bạn thực sự muốn người dùng khác cập nhật các bài viết của nhau, cách của bạn là tốt – PeterWong

+0

Oh OK, cảm ơn vì lời giải thích. Tôi sẽ sử dụng phương pháp này trong ứng dụng của tôi. – LearningRoR

Các vấn đề liên quan