说我有三个型号:
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,这并不总是正确的。
答案 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)