2013-07-05 11 views
27

Ben raylar için oldukça yeni ve şeyler anlamaya çalışıyorum. Son zamanlarda bir mailer tüm kurulum var ve iyi çalışıyordu. Ama kullanıcı eylemleri için ikinci bir mailer eklemeye çalışıyorum ve işe yaramıyor.Raylar - Devise sonra kullanıcı e-postası gönder/oluştur

Neyi başarmaya çalıştığım, bir kullanıcının kaydolduğu, yöneticiye e-posta gönderdiği ve yöneticinin kullanıcıyı etkinleştirmesi gerektiğidir. Şu anda yönetici kullanıcıya olanak tanıdığında onlara bir e-posta gönderecektir, ancak bir nedenden dolayı yeni oluşturduğum kullanıcı e-postası ateş etmiyor. Bunun sebebi, yaratma yöntemimin patlamaması, nereye koymalıyım? Bir kullanıcı yönteminin üzerine yazmam gerekiyor mu?

Benim UserMailer kontrolörü:

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 

Benim users_controller:

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 

Ancak bu oluşturmak yöntem asla kovuluyor. Neyin yanlış olduğunu anlamıyorum. UserMailer.send_new_user_message (@user) .deliver koymak için başka bir yöntem var mı?

+0

:

dosyayı app/controllers/my_registrations_controller.rb (istersen bu isim) rotanıza Sonra

class MyRegistrationsController < Devise::RegistrationsController def create super if @user.persisted? UserMailer.new_registration(@user).deliver end end end 

oluştur

? Eğer öyleyse belki kullanıcı e-posta hesabının kullanıcı güncelleme yöntemine gönderilmelidir, eğer kullanıcı bir şekilde tüm akışını dışarıdan görmesini zorlaştırıyorsa, kullanıcı bu yöntemi kullanamaz ... – tronmcp

cevap

37

Kullanıcılar Devise ile kayıt olduklarında, UsersController numaralı telefondan geçmezler.

Posta gönderme kodunu User modeline eklemek isteyebilirsiniz. app/models/user.rb Örneğin

:

class User < ActiveRecord::Base 
    # ... 

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

    # ... 
end 

Bu Active kayıt after_create geri arama kullanarak yapılır.

+1

Bu geri dönüş yolu benim görüşüme göre daha iyi. +1 – sergserg

+0

Mükemmel. Hızlı ve kirli. Harika çalışıyor. – nulltek

+0

Bu başarısız olursa, işlem geri alınır ve nesne db'ye kaydedilmez. After_create yerine after_commit kullanmayla ne dersiniz? –

53

Onay e-postaları kontrolörden gönderilmelidir. Devise::RegistrationsController varsayılanlarını geçersiz kılmak kolaydır. Kullanıcı kayıt kullanıcı bu noktada oluşturulan

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

"if @ user.errors.empty?" Öğesini eklemelisiniz, aksi halde kayıt başarısız olsa bile e-postalar gönderiyor olacaksınız –

+0

@Alex Siri İyi fikir – Dex

+2

@AlexSiri @Dex IMO kullanmak daha iyi bir fikir olabilir. user.persisted? ', kullanıcının veritabanına gerçekten kalıcı olduğunu doğrulamak için - neredeyse kesinlikle davranış aynı olacak, ancak daha güvenli ve niyetin daha net olduğunu düşünüyorum. – Filipe

İlgili konular