Rails 4 / Devise / Merit gem:规则#上没有找到target_obj吗?

时间:2014-03-10 17:49:49

标签: ruby-on-rails devise merit-gem

我正在尝试使用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:参数的行为。

1 个答案:

答案 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