我正在尝试使用 Merit gem 在我的 Rails 应用程序中实现徽章系统。
我想给我的应用程序的前 100 位用户一个徽章。所以我将此代码添加到 badge_rules.rb
grant_on 'registrations#create', badge: 'Pioneer', model_name: 'User', to: :itself do |user|
user.id < 101
end
由于我使用的是 Devise(版本 3.2.3),因此我遵循了这个Howto并像这样过度驱动了注册控制器:
class RegistrationsController < Devise::RegistrationsController
def create
@user = build_resource # Needed for Merit
super
end
def update
@user = resource # Needed for Merit
super
end
end
但是没有创建徽章。在日志中,我可以找到这些警告:
[merit] no target_obj found on Rule#applies?
[merit] No object found, maybe you need a '@registration' variable in 'registrations_controller'?
我在 gem 的 rule.rb 文件中放了一个 binding.pry,很明显:target_obj 不是用户,它是 nil。
target_obj 应该由 badges_rules.rb 中的 to: 选项设置。所以我尝试了:本身,:用户,甚至没有,但这并没有解决我的问题。
当然,我尝试添加@registration = build_resource
到我的控制器,它消除了警告,但没有解决问题。
另一个徽章的行为是错误的。它应该授予任何成功注册的人。工作代码是这个:
grant_on 'registrations#create', badge: 'Inscription', model_name: 'User'
但是当我不得不: :itself to it 时,就像@TuteC在另一个问题中建议我那样,它不起作用。
我真的不明白 to: 参数的行为。