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