1

我有一个user模型,其中我有一种方法可以查看用户是否获得了“徽章”

def check_if_badges_earned(user)
  if user.recipes.count > 10
  award_badge(1)
end

如果他们赢得了徽章,则该award_badge方法运行并为用户提供相关的徽章。我可以做这样的事情吗?

def check_if_badges_earned(user)
  if user.recipes.count > 10
  flash.now[:notice] = "you got a badge!"
  award_badge(1)
end

奖金问题! (跛脚,我知道)

我认为我的用户可以获得徽章的所有这些“条件”的最佳位置在哪里,类似于我想的 stackoverflows 徽章。badge我的意思是在架构方面,我已经有了badgings模型。

我如何组织获得它们的条件?其中一些很复杂,例如用户登录了 100 次而没有发表评论。等等,所以似乎没有一个简单的地方可以放置这种逻辑,因为它几乎涵盖了每个模型。

4

1 回答 1

4

对不起,模型中无法访问闪存哈希,它是在控制器中处理请求时创建的。您仍然可以使用实现将徽章信息(包括闪存消息)存储在属于您的用户的徽章对象中的方法:

class Badge
  # columns:
  #    t.string :name

  # seed datas:
  #    Badge.create(:name => "Recipeador", :description => "Posted 10 recipes")
  #    Badge.create(:name => "Answering Machine", :description => "Answered 1k questions")
end

class User
  #...
  has_many :badges      

  def earn_badges
    awards = []
    awards << earn(Badge.find(:conditions => { :name => "Recipeador" })) if user.recipes.count > 10
    awards << earn(Badge.find(:conditions => { :name => "Answering Machine" })) if user.answers.valids.count > 1000 # an example
    # I would also change the finds with some id (constant) for speedup 
    awards
  end
end

然后:

class YourController
  def your_action
    @user = User.find(# the way you like)...
    flash[:notice] = "You earned these badges: "+ @user.earn_badges.map(:&name).join(", ")
    #...
  end
end
于 2010-01-04T00:18:12.193 回答