0

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

4

1 回答 1

0

:to参数可以是方法名称,它调用目标对象(在本例中为)@registration应检索对象到徽章。如果以这种方式使用它,当您放置 时:user,优点是在内部运行@registration.user以查找要标记的人,这不是我们想要的。

:to也可以是:itself,在这种情况下,它标记目标对象(在您的情况下为@registration,如果是用户,它应该为您工作)。

我相信您想要标记谁是current_user,这是此选项的默认值 ( :action_user),因此您不需要定义:to选项。

也就是说,对于徽章的优点,条件必须是true,并且可能会发生没有user作为参数传递给该规则的情况。不带参数试试:

grant_on 'registrations#create', badge: 'Pioneer' do
  User.count < 101
end
于 2014-03-12T01:15:57.557 回答