rails,`flash [:notice]`在我的模特中?

时间:2010-01-03 20:33:38

标签: ruby-on-rails application-design

我有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徽章。我的意思是在架构方面,我已经拥有badgebadgings模型。

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

1 个答案:

答案 0 :(得分:4)

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

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