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

ボーナス質問! (ラメ、私は知っている)

ユーザーがバッジを獲得できるこれらの「条件」をすべて保持するのに最適な場所はどこでしょうか。つまり、アーキテクチャに関しては、私はすでにbadgebadgingsモデルを持っています。

獲得条件を整理するにはどうすればよいですか?それらのいくつかは、ユーザーが一度もコメントせずに 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 に答える