我有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次而没有评论一次。所以似乎没有一个简单的地方来放置这种逻辑,因为它几乎涵盖了每个模型。
答案 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