2013-07-05 28 views
27

Tôi khá mới với đường ray và cố gắng tìm ra mọi thứ. Gần đây tôi đã có một bưu phẩm tất cả các thiết lập và nó đã làm việc tốt. Nhưng tôi đang cố gắng thêm một bưu phẩm thứ hai cho hành động của người dùng và nó dường như không hoạt động.Rails - Devise gửi email cho người dùng sau khi sign_up/tạo

Điều tôi đang cố gắng đạt được là người dùng đăng ký, họ sẽ gửi email tới quản trị viên, khi đó quản trị viên phải bật người dùng. Hiện tại, khi quản trị viên cho phép người dùng, họ sẽ gửi email cho họ, nhưng vì lý do nào đó, email người dùng mới tạo của tôi không kích hoạt. Tôi nghĩ điều này là do phương pháp tạo của tôi không kích hoạt, tôi nên đặt nó ở đâu? Tôi có cần ghi đè phương pháp người dùng không?

My UserMailer điều khiển:

class UserMailer < ActionMailer::Base 
    default from: "[email protected]" 
    def send_enabled_message(user) 
    @user = user 
    mail(:to => user.email, :subject => "Welcome to Pixel Technologies!!!") 
    end 
    def send_new_user_message(user) 
    @user = user 
    mail(:to => '[email protected]', :subject => "New User created please review and enable.") 
    end 
end 

users_controller của tôi:

class UsersController < ApplicationController 
    before_filter :authenticate_user! 
    load_and_authorize_resource 

# POST /users 
def create 
    @user = User.new(user_params) 
    puts "******************** NEW USER ****************************" 
    puts user_params 
    if @user.save 
    puts 'Sending email for create user' 
    UserMailer.send_new_user_message(@user).deliver 
    redirect_to @user, notice: 'User was successfully created.' 
    else 
    render action: 'new' 
    end 
end 

Nhưng tạo phương pháp này không bao giờ bị sa thải. Tôi đang làm gì sai. Có phương pháp nào khác mà tôi cần phải đặt UserMailer.send_new_user_message (@user) .deliver không?

+0

Khi người dùng đăng ký là người sử dụng tạo ra tại thời điểm đó? Nếu vậy thì có lẽ email của bạn sẽ được gửi trên phương thức cập nhật người dùng nếu quản trị viên bằng cách nào đó cho phép người dùng, khó xem từ điều này với toàn bộ luồng ... – tronmcp

Trả lời

37

Khi người dùng đăng ký với Devise, họ không đi qua số UsersController.

Bạn có thể muốn thêm mã gửi thư trong mô hình User.

Ví dụ, trong app/models/user.rb:

class User < ActiveRecord::Base 
    # ... 

    after_create :send_admin_mail 
    def send_admin_mail 
    UserMailer.send_new_user_message(self).deliver 
    end 

    # ... 
end 

này được thực hiện bằng cách sử dụng Active Record after_create gọi lại.

+1

Cách gọi lại này tốt hơn theo ý kiến ​​của tôi. +1 – sergserg

+0

Tuyệt vời. Nhanh chóng và hèn hạ. Hoạt động tuyệt vời. – nulltek

+0

Nếu điều này không thành công, giao dịch sẽ được khôi phục và đối tượng sẽ không được lưu vào db. Làm thế nào về việc sử dụng after_commit thay vì after_create? –

53

Email xác nhận phải được gửi từ bộ điều khiển. Thật đơn giản để ghi đè các giá trị mặc định là Devise::RegistrationsController.

Tạo file app/controllers/my_registrations_controller.rb (tên này bất cứ điều gì bạn muốn)

class MyRegistrationsController < Devise::RegistrationsController 

    def create 
    super 
    if @user.persisted? 
     UserMailer.new_registration(@user).deliver 
    end 
    end 

end 

Sau đó, trong các tuyến đường của bạn:

devise_for :users, :controllers => { :registrations => "my_registrations" } 
+3

Bạn nên thêm 'if @ user.errors.empty? ', Nếu không bạn sẽ gửi email ngay cả khi đăng ký không thành công –

+0

@Alex Siri Ý tưởng hay: – Dex

+2

@AlexSiri @Dex IMO có thể là một ý tưởng hay hơn để sử dụng' @ user.persisted? 'để xác minh rằng người dùng đã thực sự tồn tại trong cơ sở dữ liệu - gần như chắc chắn hành vi sẽ giống nhau, nhưng nó an toàn hơn và tôi nghĩ ý định rõ ràng hơn. – Filipe

Các vấn đề liên quan