2011-07-12 88 views
11

是否有一個掛鉤或回調,我可以實現,以便在用戶創建後,我想調用一些自定義代碼?設計後創建掛鉤

我試過在用戶模型中的after_confirmation掛鉤,但沒有奏效。

回答

17

使用由Rails提供的標準after_create回調。

class User < ActiveRecord::Base 
    after_create :do_something 

    def do_something 
    puts "Doing something" 
    end 
end 
+0

我該如何使用它來訪問用戶?例如我想給用戶一個使用Royce的默認角色,所以它只是'@ user',所以我可以做'@user.add_role:user' – Un3qual

+1

@Un3qual' self' –

+0

謝謝!我現在覺得很蠢。 – Un3qual

4

如果您正在處理您創建的模型的內部狀態,那麼使用回調是完全合法的。

創建User後,我需要創建默認的Team。最好避免使用回調來處理其他對象

「after_ *」回調函數主要用於保存或持久化對象。一旦物體被保存,物體的目的(即責任)就已經實現了,所以我們通常看到的是回傳到其責任區之外,那就是當我們遇到問題時。

From this awesome blog post

在這種情況下,最好是行爲控制器,在那裏你可以成爲一個更清潔的解決方案直接添加你的功能,或delegate to a service上:

# shell 
rails g devise:controllers users 

# config/routes.rb 
devise_for :users, controllers: { registrations: "users/registrations" } 

# app/controllers/users/registrations_controller.rb 
class Users::RegistrationsController < Devise::RegistrationsController 
    after_action :create_default_team, only: :create 

    private 

    def create_default_team 
    Team.create_default(@user) if @user.persisted? 
    end 
end 
6

我使用Rails 4設計3.5 confirmable,由於各種驚喜,不得不這樣做。

class User < ActiveRecord::Base 
    # don't use after_create, see https://github.com/plataformatec/devise/issues/2615 
    after_commit :do_something, on: :create 

    private 

    def do_something 
     # don't do self.save, see http://stackoverflow.com/questions/22567358/ 
     self.update_column(:my_column, "foo") 
    end 
end