Rails模型涉及current_user的行为

时间:2013-10-26 00:39:07

标签: ruby-on-rails devise activemodel

说我有三个型号:

Post
 has_many :comment
 has_many :user, through post_user

Comment
 belongs_to Post

User
 has_many :post, through post_user

登录用户可以创建/编辑任何帖子或评论。

每当用户创建/编辑帖子或评论时,我都想将current_user添加到帖子中,例如@ post.users<< CURRENT_USER。

如何在不必在每个控制器操作中复制它的情况下确保此逻辑?我不想使用after_save,因为这需要访问模型中的current_user,这并不总是正确的。

1 个答案:

答案 0 :(得分:2)

看起来您的关联设置不正确:

尝试:

 # Post model associations
 has_many :comments
 has_many :post_users
 has_many :users, through: :post_users

 # Comment model associations
 belongs_to :post
 belongs_to :user    

 # User model associations
 has_many :post_users 
 has_many :posts, through: :post_users   
 has_many :comments

 # PostUser model associations
  belongs_to :user
  belongs_to :post,

现在,您可以在Post控制器中执行以下操作:

def new
  @post = Post.new
end

def create
  @post = Post.new(params[:post])
  if @post.save
    current_user.posts << @post
    redirect_to :show
  else
    render :new
  end
end

def edit
  @post = Post.find(params[:id])   
end

def update
  @post = Post.find(params[:id])

  if @post.update_attributes(params[:post])
   current_user.posts << @post unless current_user.posts.include(@post)
   redirect_to :show
  else
    render :new
  end
end

试一试。 您应该能够在Comments控制器中实现类似的功能,以获得所需的内容。

更新:

为了解决一些问题,为什么不在Post模型上定义一个方法(以及在评论模型中类似的东西)来处理创建用户关联?

def add_user(user)
  self.users << user unless users.include(user)
end

然后你可以随时在控制器中调用它:

@post.add_user(current_user)

替换它:

current_user.posts << @post unless current_user.posts.include(@post)