2011-07-12 36 views
11

Có móc hoặc gọi lại mà tôi có thể triển khai sao cho ngay sau khi người dùng được tạo, tôi muốn gọi một số mã tùy chỉnh?phát sinh sau khi tạo móc

Tôi đã thử móc sau khi xác nhận trong mô hình người dùng nhưng điều đó không hiệu quả.

Trả lời

17

Sử dụng gọi lại chuẩn after_create được cung cấp bởi Rails.

class User < ActiveRecord::Base 
    after_create :do_something 

    def do_something 
    puts "Doing something" 
    end 
end 
+0

Tôi làm cách nào để sử dụng quyền này để truy cập người dùng? Ví dụ: tôi muốn cung cấp cho người dùng vai trò mặc định bằng cách sử dụng Royce, do đó, nó chỉ là '@ user', vì vậy tôi có thể thực hiện '@user.add_role: user' – Un3qual

+1

@ Un3qual' self' –

+0

Cảm ơn! Tôi cảm thấy thực sự ngu ngốc bây giờ. – Un3qual

4

Sử dụng gọi lại hoàn toàn hợp pháp nếu bạn đang xử lý trạng thái nội bộ của mô hình bạn đã tạo.

Sau khi tạo User, tôi cần tạo mặc định Team. Bạn nên sử dụng tránh sử dụng các cuộc gọi lại để đối phó với các đối tượng khác.

callbacks "after_ *" chủ yếu được sử dụng liên quan đến việc lưu hoặc duy trì đối tượng. Khi đối tượng được lưu, mục đích (nghĩa là trách nhiệm) của đối tượng đã được đáp ứng, và vì vậy những gì chúng ta thường thấy là các cuộc gọi lại nằm ngoài phạm vi trách nhiệm của nó và đó là khi chúng ta gặp phải vấn đề.

From this awesome blog post.

Trong trường hợp này nó tốt hơn để hành động trên bộ điều khiển, nơi bạn có thể thêm chức năng của bạn trực tiếp, hoặc delegate to a service cho một giải pháp thậm chí sạch hơn:

# 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

Tôi đang sử dụng Rails 4 với lập mưu 3.5 với confirmable và phải làm điều này do nhiều bất ngờ khác nhau.

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 
Các vấn đề liên quan