0

假设我有三个模型:

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 ,这并不总是正确的。

4

1 回答 1

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)
于 2013-10-26T00:44:36.290 回答