Rails 4 / Devise / Merit gem: не найден target_obj в Правиле #?

Я пытаюсь реализовать систему бейджей в своем приложении Rails, используя драгоценный камень Merit.

Я хочу дать значок 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'?

Я поместил binding.pry в файл rule.rb в геме, и стало ясно: target_obj - это не пользователь, а nil.

Предполагается, что target_obj устанавливается параметром to: в badges_rules.rb. Поэтому я попробовал: себя, пользователя и даже ничего, но это не решило мою проблему.

Конечно я пытался добавить @registration = build_resource моему контроллеру сняли предупреждение, но проблему не решили.

Поведение другого значка является своего рода неправильным. Это должно быть предоставлено любому, кто успешно зарегистрировался. Вот рабочий код:

grant_on 'registrations#create', badge: 'Inscription', model_name: 'User'

Но когда мне пришлось:: сам к нему, как TuteC советуют мне в другом вопросе, это не работает.

Я действительно не понимаю поведение параметра to:.

1 ответ

Решение

: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
Другие вопросы по тегам