Rails: обновление оценки пользователя после того, как он написал комментарий - PullRequest
0 голосов
/ 04 мая 2011

Я действительно новичок в Rails и мне интересно, как можно сделать следующее:

После того, как пользователь написал комментарий к греху (= статья), автор (= пользователь)должен получить 20 очков (например), добавленных к его счету (= user.score).счет - это столбец в моей таблице пользователей.

Мои модели выглядят так:

class User < ActiveRecord::Base
  has_many :comments, :dependent => :destroy
  has_many :absolutions, :dependent => :destroy
end

class Comment < ActiveRecord::Base
  belongs_to :user
  belongs_to :sin
end

class Sin < ActiveRecord::Base
  has_many :comments, :dependent => :destroy
end

Контроллер моих комментариев выглядит следующим образом:

class CommentsController < ApplicationController

  def new
    @comment = Comment.new
  end

  def create
    @sin = Sin.find(params[:sin_id])
    @comment = current_user.comments.build(params[:comment])
    @comment.sin_id = @sin.id
    if @comment.save
      flash[:success] = "Comment created!"
      redirect_to sin_path(@sin)
    else
      flash[:error] = "Comment was not created."
      redirect_to sin_path(@sin)
    end
  end

end

После нескольких часов работычтобы получить это самостоятельно, я немного запутался.После создания комментария я хотел бы изменить конкретное значение связанного объекта Пользователь.

Каков наилучший способ сделать это?

Спасибо за вашу помощь!

Ответы [ 3 ]

1 голос
/ 04 мая 2011

Определите обратный вызов after_save в модели комментария:

class Comment < ActiveRecord::Base
  [...]

  after_save :add_score

  private

  def add_score
    self.user.score += 20
    self.user.save
  end
end
1 голос
/ 04 мая 2011

Вы можете просто добавить его после сохранения:

if @comment.save
  flash[:success] = "Comment created!"
  current_user.score += 20
  current_user.save
  redirect_to sin_path(@sin)
else

НО, всегда лучше делать это в вашей модели. Так что я бы создал метод экземпляра add_score в вашей пользовательской модели и обновил бы счет там. Затем я бы просто вызвал этот метод в контроллере, в том же месте.

0 голосов
/ 04 мая 2011

Вы можете использовать обратный вызов after_create в вашей модели комментариев, который вносит изменения в соответствующего пользователя?

Этот тип логики не принадлежит контроллеру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...