Поведение модели Rails с использованием current_user

Скажем, у меня три модели:

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 ответ

Похоже, что ваши ассоциации настроены неправильно:

Пытаться:

# 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

Попробуйте. Вы должны иметь возможность реализовать что-то подобное в своем контроллере комментариев, чтобы получить то, что вам нужно.

ОБНОВИТЬ:

Для СУБДНОСТИ немного, почему бы не определить метод на модели 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)

licensed under cc by-sa 3.0 with attribution.