Rails:在撰写评论后更新用户的分数

时间:2011-05-03 22:25:54

标签: ruby-on-rails comments

我对Rails真的很陌生,我想知道如何做到以下几点:

在用户为sin(=文章)撰写评论后,作者(=用户)应该将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 个答案:

答案 0 :(得分:1)

你可以在保存后添加它:

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

但是,在你的模型中做它总是更好。所以我会在你的用户模型中创建一个add_score实例方法并在那里更新分数。然后,我只是在控制器中,在同一个地方调用该方法。

答案 1 :(得分:1)

在评论模型中定义after_save回调:

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

  after_save :add_score

  private

  def add_score
    self.user.score += 20
    self.user.save
  end
end

答案 2 :(得分:0)

您可以在评论模型中使用after_create回调来对相应的用户进行更改吗?

这种逻辑不属于控制器。