Как ни странно, большая часть этого работает так, как было написано, однако я не уверен, как я могу оценить, если current_user
имеет значок, (все отношения правильные, у меня только проблемы с моими методами в моем классе (который должен быть частично перемещен в библиотеку или что-то в этом роде), независимо от того, проблема именно в 1) проверке, есть ли у текущего пользователя запись, и 2), если нет, создать соответствующую новую запись.
Если есть более простой или лучший способ сделать это, пожалуйста, поделитесь. Вот что у меня есть:
# Recipe Controller
class RecipesController < ApplicationController
def create
# do something
if @recipe.save
current_user.check_if_badges_earned(current_user)
end
end
Так что для этого, это определенно кажется грязным, я бы хотел, чтобы оно было просто check_if_badges_earned
и не должно было передавать current_user
в метод, но может понадобиться, потому что это может не всегда быть текущим пользователь, инициирующий этот метод.
# User model
class User < ActiveRecord::Base
def check_if_badges_earned(user)
if user.recipes.count > 10
award_badge(1, user)
end
if user.recipes.count > 20
award_badge(2, user)
end
end
def award_badge(badge_id, user)
#see if user already has this badge, if not, give it to them!
unless user.badgings.any? { |b| b[:badge_id] == badge_id}
@badging = Badging.new(:badge_id => badge_id, :user_id => user)
@badging.save
end
end
end
Таким образом, хотя первый метод (check_if_badges_earned
), кажется, оправдывает штраф и дает прогон award_badge()
только при выполнении условий, проблема возникает в самом методе award_badge()
, выражение unless user.badgings.any? { |b| b[:badge_id] == badge_id}
всегда оценивается как истинное, поэтому пользователю дается значок, даже если он уже был у него (badge_id), во-вторых, проблема в том, что он всегда сохраняет user_id
как 1.
Любые идеи о том, как отладить это, были бы великолепны!