web-dev-qa-db-ja.com

Railsデバイス:after_confirmation

after_confirmation :do_somethingを作成する方法はありますか?

目標は、ユーザーがDevise :confirmableを使用して確認した後に電子メールを送信することです。

33
donald

デバイス3.xの新しいバージョンの場合:

別の答えを参照してください http://stackoverflow.com/a/20630036/2832282

古いバージョンのデバイス2.xの場合:

(元の回答)

ただし、ユーザーにbefore_saveコールバック(オブザーバーを使用した場合の追加クレジット)を設定して、confirmed_atがdeviseによって設定されたかどうかを確認できるはずです。次のようなことができます。

  send_the_email if self.confirmed_at_changed?

http://api.rubyonrails.org/classes/ActiveModel/Dirty.html フィールドでの変更の確認の詳細については。

24
njorden

Devise 3.1.2を使用していますが、プレースホルダーメソッドがありますafter_confirmation確認が正常に終了した後に呼び出されます。 Userモデルでこのメソッドをオーバーライドする必要があります。

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable, :confirmable

  # Override Devise::Confirmable#after_confirmation
  def after_confirmation
    # Do something...
  end
end

参照:Devise 3.5.9ソースコード: https://github.com/plataformatec/devise/blob/d293e00ef5f431129108c1cbebe942b32e6ba616/lib/devise/models/confirmable.rb

84
Blue Smith

confirm!メソッドをオーバーライドできます。

def confirm!
  super
  do_something
end

このトピックに関するディスカッションは https://github.com/plataformatec/devise/issues/812 にあります。彼らは、after_confirmation :do_somethingのようなコールバックはない、というのは、そのアプローチには多くの異なるコールバックが必要になるからです。

10
Bernát

Rails 4:

上記の複数の回答を組み合わせる

  def first_confirmation?
    previous_changes[:confirmed_at] && previous_changes[:confirmed_at].first.nil?
  end

  def confirm!
    super
    if first_confirmation?
      # do first confirmation stuff
    end
  end
5
noli

devise 3.5.9のソースコードによると、Deviseリソースモデルでメソッドを定義するだけです。例:

  class User < ActiveRecord::Base
  ...
    def after_confirmation
       do_something
    end
  end

参照:Devise 3.5.9ソースコード: https://github.com/plataformatec/devise/blob/d293e00ef5f431129108c1cbebe942b32e6ba616/lib/devise/models/confirmable.rb

2
Tilo

そのコールバックも表示されません。確認メソッドをオーバーライドして、そこでコールバックを呼び出すことができます。

def send_confirmation_instructions(attributes={})
  super(attributes)
  your_method_here
end
1
dombesz

モデルのconfirm!メソッドをオーバーライドできます

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable, :confirmable

  def confirm!
    super
    do_something
  end
end

トピックについての議論があります https://github.com/plataformatec/devise/issues/812 。私はこの方法を試しましたが、うまくいきました。

1
goma

@Bernátと@RyanJMからの回答を組み合わせています。

def confirm!
  super
  if confirmed_at_changed? and confirmed_at_was.nil?
    do_stuff
  end
end

これは、2つの答えを別々に使用するよりも、パフォーマンスを意識して安全であるように思われます。

0
toobulkeh