2017-05-14 25 views
6

Tôi không được hiểu một điều gì đó tầm thường về email nhưng máy chủ lưu trữ trong defaul_url_options làm gì? Sự cần thiết cho các thiết lập smtp có ý nghĩa với tôi để cấu hình cách email sẽ được gửi đi nhưng làm thế nào là default_url_options có liên quan đến điều đó?ActionMailer default_url_options là gì?

config.action_mailer.raise_delivery_errors = true 
    config.action_mailer.delivery_method = :smtp 
    host = '<your heroku app>.herokuapp.com' 
    config.action_mailer.default_url_options = { host: host } 
    ActionMailer::Base.smtp_settings = { 
    :address  => 'smtp.sendgrid.net', 
    :port   => '587', 
    :authentication => :plain, 
    :user_name  => ENV['SENDGRID_USERNAME'], 
    :password  => ENV['SENDGRID_PASSWORD'], 
    :domain   => 'heroku.com', 
    :enable_starttls_auto => true 
    } 

Trả lời

8

Thiết lập default_url_options rất hữu ích cho việc xây dựng URL liên kết trong các mẫu email. Thông thường, :host, tức là tên đầy đủ của máy chủ web, là cần thiết để được thiết lập với tùy chọn cấu hình này. Không có gì liên quan đến việc gửi email, nó chỉ định cấu hình hiển thị các liên kết trong email.

Nhu cầu thiết lập này là độc đáo được ghi lại trong Rails Guides cũng ActionMailer::Base sources:

URLs can be generated in mailer views using url_for or named routes. Unlike controllers from Action Pack, the mailer instance doesn't have any context about the incoming request, so you'll need to provide all of the details needed to generate a URL.

When using url_for you'll need to provide the :host , :controller , and :action:

<%= url_for(host: "example.com", controller: "welcome", action: "greeting") %> 

When using named routes you only need to supply the :host

<%= users_url(host: "example.com") %> 

Vì vậy, để xây dựng lại và các tài liệu, các trang web, tên của các máy chủ web hiện tại (được sử dụng trong tuyệt đối liên kết) được lấy từ thông tin yêu cầu đến. Nhưng bạn không có thông tin này khi hiển thị email (không có yêu cầu), đó là lý do bạn phải cung cấp thông tin theo cách thủ công để các liên kết trong email hoạt động đúng cách.

1

Bạn đã từng tạo URL trong mẫu ActionMailer chưa? Nếu bạn đã làm ít nhất một lần, sau đó bạn có thể quen với các lỗi sau:

ActionView::TemplateError (Missing host to link to! Please provide :host parameter or set default_url_options[:host]) 

Điều này xảy ra bởi vì ActionMailer dụ không có bất kỳ bối cảnh về yêu cầu đến vì vậy bạn sẽ cần phải cung cấp: máy chủ, : controller, và: action :. Nếu bạn sử dụng một tuyến đường được đặt tên, ActionPack cung cấp tên bộ điều khiển và hành động cho bạn. Nếu không, với trình trợ giúp url_for bạn cần phải chuyển tất cả các tham số.

<%= message_url %> 
<%= url_for :controller => "messages", :action => "index" %> 

Bất kể lựa chọn của bạn, bạn luôn cần cung cấp tùy chọn lưu trữ để tạo URL trong ActionMailer. Như đã trình bày bởi hướng dẫn ActionMailer, về cơ bản bạn có hai cách để vượt qua giá trị máy chủ để ActionMailer:

1. set a global value 
2. pass the option each time you generate an URL 

default_url_options Xác định là tốt hơn sau đó đi qua URL mọi. Đó là lý do chúng tôi làm.

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