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: オプションで設定されるはずです。だから私は:itself、:user、そして何も試しませんでしたが、それは私の問題を解決しません。

もちろん@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 に答える