2015-09-21 4 views
1

Я пытаюсь отправить почту из файла в каталоге lib. Я использовал Action Mailer Basics, чтобы помочь мне настроить это. Я могу успешно отправлять почту с моего контроллера, поэтому я думаю, что моя проблема не требует должной почты в моем файле lib «filename.rb».Rails ActionMailer lib directory

Я бегу ruby filename.rb и получить

/pathtofile/lib/otherfile.rb:37:in `alert': uninitialized constant UserMailer (NameError) 
from filename.rb:47:in `block in <main>' 
from filename.rb:35:in `secondly_loop' 
from filename.rb:47:in `<main>' 

filename.rb

alert 

otherfile.rb

def alert 
    #send email http://www.gotealeaf.com/blog/handling-emails-in-rails 
    UserMailer.mailer_method().deliver_now 
    puts "Sent Email" 
end #end def alert 

приложение/почта ERS/user_mailer.rb

class UserMailer < ApplicationMailer 
    default from: '[email protected]' 

    def mailer_method(a) 
    @a = a 
    mail(to: '[email protected]', subject: "Hello you have new mail") 
    end 
end 

приложение/просмотров/mailer_method.html.erb

<!DOCTYPE html> 
<html> 
    <head> 
    <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /> 
    </head> 
    <body> 
    <h2>Daniel, </h2> 
    <p>Your email is boring and has arrived now.<br><br> 
     Sincerely,<br> 
     Daniel</p> 
    </body> 
</html> 

ответ

0

Rails автоматически загружает модели для вас. Просто вызывая ruby filename.rb, вы не загрузите UserMailer, так что вы получите ошибку uninitialized constant, потому что в текущем пространстве имен нет UserMailer.

EDIT Вот SSCCE, что позволяет вызывать alert: обратите внимание, что он находится в пространстве имен MyAlert; Рельсы автоматически загружаются UserMailer, так что они доступны в пределах пространства имен MyAlert.

Я немного изменил некоторые определения ради краткости и ясности.

my_alerts.rb

class MyAlerts 
    def self.alert 
    UserMailer.mailer_method("It worked") 
    puts "Sent Email" 
    end 
end 

application_mailer.rb

class ApplicationMailer < ActionMailer::Base 
    default from: "[email protected]" 
    layout 'mailer' 
end 

user_mailer.rb

class UserMailer < ApplicationMailer 
    default from: '[email protected]' 

    def self.mailer_method(a) 
    puts a 
    end 
end 

Выход:

[email protected]:~/Documents/rails/textgen$ rails c 
Loading development environment (Rails 4.2.4) 
2.2.1 :001 > MyAlerts.alert 
It worked 
Sent Email 
=> nil 
+0

Я не могу понять, как вызвать 'alert', и даже если он работает в' rails console' Я не понимаю, как рельсы взаимодействуют с lib – Daniel

+0

@ Daniel Я предоставил SSCCE, который, надеюсь, будет делать вещи Чисто. – brito

+0

Это очень помогает, но я все равно получаю такое же сообщение об ошибке. Я даже сделал это: – Daniel

0

Это обновленный пример использования требуется. Обратите внимание, я не рекомендую делать это на самом деле, как это должно быть установлено в качестве задачи грабли, так что это чисто пример использования потребуется:

Библиотека/filename.rb

#!/usr/bin/env ruby 

require_relative './my_alert' 

MyAlert.alert 

Lib/my_alert.гь

require_relative '../app/mailers/user_mailer' 

class MyAlert 
    def self.alert 
    #send email 
    UserMailer.mailer_method("foo").deliver_now 
    puts "Sent Email" 
    end 
end 

приложение/отправители/user_mailer.rb

require 'action_mailer' 

class UserMailer < ActionMailer::Base 
    default from: '[email protected]' 

    def mailer_method(a) 
    @a = a 
    mail(to: "[email protected]", subject: "Hello you have new mail") 
    end 
end 

Я получил эту работу в тестовом приложении, так что он может получить доступ к UserMailer, но это на самом деле не работает, как приложение rails, вам нужно будет добавить еще какой-нибудь код, чтобы ActionMailer знал, где искать шаблон. Выполнение задачи рейка будет фактически запускать ее через Rails, что было бы предпочтительнее.

+0

Я не мог получить какую-либо комбинацию require/require_relative '../app/mailers/user_mailer.rb' для работы – Daniel

+0

Когда вам потребуется, вам нужно опустить расширение .rb, поэтому вы должны использовать: require_relative '../app/mailers/user_mailer' NOT require_relative '../app/mailers/user_mailer.rb' – MikeS

+0

Когда я уже пытался раньше, я попробовал различные комбинации require/require_relative и «../app/mailers/user_mailer» или «~/app/mailers/user_mailer» 'user_mailer' (с и без .rb) .... 12 комбо я думаю – Daniel

0

Если вы используете папку rails lib, тогда вы должны использовать рельсы для запуска своего кода. Вы пытаетесь запустить рубиновый код, который включает в себя компоненты рельсов вне контекста рельсов. Когда вы запустите ruby filename.rb, вы пройдете все магии, которые входят в автозагрузку рельсов. ActionMailer - это драгоценный камень, и обычно этот драгоценный камень загружается для вас через связующий агент при запуске сервера rails. Посмотрите на свой config/applicarion.rb, чтобы понять, что я делаю. И если вы все еще запутались, прочитайте: http://guides.rubyonrails.org/autoloading_and_reloading_constants.html

Я думаю, что вы хотите построить двигатель рельсов. Таким образом, вы можете сохранить свой код модульным, но все же иметь доступ ко всем различным компонентам рельсов и драгоценным камням, таким как ActionMailer. Есть миллион потрясающих уроков о том, как создать рельсовый движок, чтобы вы начали, но я бы начал с чтения рубинов на официальных руководствах по рельсам.