after_confirmation :do_something
を作成する方法はありますか?
目標は、ユーザーがDevise :confirmable
を使用して確認した後に電子メールを送信することです。
デバイス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 フィールドでの変更の確認の詳細については。
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
confirm!
メソッドをオーバーライドできます。
def confirm!
super
do_something
end
このトピックに関するディスカッションは https://github.com/plataformatec/devise/issues/812 にあります。彼らは、after_confirmation :do_something
のようなコールバックはない、というのは、そのアプローチには多くの異なるコールバックが必要になるからです。
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
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
そのコールバックも表示されません。確認メソッドをオーバーライドして、そこでコールバックを呼び出すことができます。
def send_confirmation_instructions(attributes={})
super(attributes)
your_method_here
end
モデルの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 。私はこの方法を試しましたが、うまくいきました。
@Bernátと@RyanJMからの回答を組み合わせています。
def confirm!
super
if confirmed_at_changed? and confirmed_at_was.nil?
do_stuff
end
end
これは、2つの答えを別々に使用するよりも、パフォーマンスを意識して安全であるように思われます。