我正在尝试使用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不是User,它是nil。
target_obj应该由badges_rules.rb中的to:选项设置。所以我尝试了:本身,:用户,甚至没有,但它没有解决我的问题。
当然我试图将@registration = build_resource
添加到我的控制器中,它取消了警告但没有解决问题。
另一个徽章的行为有点不对劲。任何成功注册的人都可以获得批准。工作代码就是这个:
grant_on 'registrations#create', badge: 'Inscription', model_name: 'User'
但是当我不得不这样做时:就像@TuteC在另一个问题上建议我一样,它不起作用。
我真的不明白to:参数的行为。
答案 0 :(得分:0)
:to
参数可以是方法名称,调用目标对象(在这种情况下,@registration
)应该将对象检索到徽章。如果以这种方式使用它,当您放置:user
时,优点是在内部运行@registration.user
以查找徽章的人,这不是我们想要的。
:to
也可以是:itself
,在这种情况下,它会对目标对象进行标记(在您的情况下为@registration,如果是User,则应该为您工作)。
我相信您想要标记current_user
的任何人,这是此选项的默认设置(:action_user
),因此您不需要定义:to
选项
那就是说,对于徽章的优点,条件必须是true
,并且可能会发生没有user
作为参数传递给该规则。尝试不带参数:
grant_on 'registrations#create', badge: 'Pioneer' do
User.count < 101
end