2

我正在使用 devise_invitable 允许用户互相邀请。我想在创建邀请或接受邀请时为用户设置值。一种方法在这里

使用 devise_invitable 将用户添加到 Ruby on Rails 中的组?

但这似乎有点矫枉过正。回调看起来像是一个完美的解决方案,但在我的 Rspec 测试期间它们似乎没有触发。

这是用户模型:

class User < ActiveRecord::Base
  belongs_to :company

  rolify
  # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable,
  # :lockable, :timeoutable and :omniauthable
  devise :invitable, :database_authenticatable, :registerable, :confirmable,
         :recoverable, :rememberable, :trackable, :validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :role_ids, :as => :admin
  attr_accessible :name, :email, :password, :password_confirmation, :remember_me, :company
  validates :company, :presence => true

  after_invitation_accepted :email_invited_by
  before_invitation_accepted :email_invited_by

  private

    def email_invited_by
      # This is NEVER executed during tests, even when an invite is successfully accepted
       puts "Callback worked"
    end

end

任何关于在哪里看的线索将不胜感激。我发现 devise_invitable 文档有点不透明。

谢谢!

4

2 回答 2

0

如果用户确实被邀请(即对象被持久化并且有一个邀请令牌集)并且对象(用户的对象)没有验证错误,则将触发 devise_invitable 回调。也就是说,我看到您在company没有任何条件的情况下验证存在,我认为这可能会导致验证错误。

如果是这种情况,您可以添加这样的条件

validates :company, :presence => true, :if => Proc.new { self.invitation_token.nil? }

所以它不会导致验证错误并触发回调。

于 2012-12-31T21:19:33.153 回答
0

对于那些仍在寻找答案的人来说,这对我有用。

问题不在于验证,因为在devise_invitable邀请时有一个要验证的配置,它默认为false

# Flag that force a record to be valid before being actually invited
# Default: false
# config.validate_on_invite = true

所以我的解决方案是使用提供的回调devise_invitable

after_invitation_accepted :create_profile

请注意,这需要在下面devise :invitable

于 2016-02-16T05:59:48.013 回答