Симон Моурир дал этот пример :
object o = null;
DateTime d = (DateTime)o; // NullReferenceException
, где unboxing преобразование (литье) из object
(или из одного из классов System.ValueType
или System.Enum
или из типа интерфейса) - тип значения (кроме Nullable<>
) сам по себе дает NullReferenceException
.
В другом направлении конверсия бокса из a Nullable<>
, которая имеет HasValue
, равную false
, на ссылочный тип, может дать ссылку null
, которая затем может привести к NullReferenceException
. Классический пример:
DateTime? d = null;
var s = d.ToString(); // OK, no exception (no boxing), returns ""
var t = d.GetType(); // Bang! d is boxed, NullReferenceException
Иногда бокс происходит по-другому. Например, с помощью этого не общего метода расширения:
public static void MyExtension(this object x)
{
x.ToString();
}
следующий код будет проблематичным:
DateTime? d = null;
d.MyExtension(); // Leads to boxing, NullReferenceException occurs inside the body of the called method, not here.
Эти случаи возникают из-за специальных правил, используемых во время выполнения при боксе Nullable<>
экземпляров.
Вы можете сделать это в контроллере:
class ApplicationController < ActionController::Base
...
private
def set_mailer_settings
ActionMailer::Base.smtp_settings.merge!({
username: 'username',
password: 'yoursupersecretpassword'
})
end
end
Так как файлы конфигурации все Ruby, тогда настройки могут быть легко извлечены из файла конфигурации или т. п. во время выполнения.
Вот сообщение, которое я написал некоторое время назад на , чтобы заставить ActionMailer работать с GMail SMTP .
ПРИМЕЧАНИЕ. Если вы используете рельсы 2.3 и Ruby 1.87, вам не нужен плагин и вы можете просто использовать настройки в этого комментария
Предполагая, что вы настроили smtp_settings в своей среде или инициализаторах, вы можете просто установить имя пользователя так:
Notifier.smpt_settings.merge!({:user_name => "x", :password=> "y"})
(Rails 3)
Поскольку я вызываю почтовую программу следующим образом:
CustomerMailer.customer_auto_inform(@form).deliver
В классе CustomerMailer у меня есть частный метод:
def init_email_account(shop_mail)
ActionMailer::Base.raise_delivery_errors = true
ActionMailer::Base.smtp_settings = {
:address => shop_mail.address,
:port => shop_mail.port,
:domain => shop_mail.domain,
:user_name => shop_mail.user_name,
:password => shop_mail.password,
:authentication => shop_mail.authentication.name,
:enable_starttls_auto => shop_mail.enable_starttls_auto
}
end
Before вызывающая почта (), которая отправляет электронную почту, вы должны вызвать частный метод init_email_account для заполнения smtp_settings из базы данных. shop_mail - это модель, в которой хранятся данные о настройках учетной записи электронной почты.
HTH